求指教:两个512阶float矩阵相乘,结果写入一个txt里边,运行之后文件大小不对。
两个512阶的单精度浮点数矩阵相乘,结果写入一个matrix.txt文件里边。
按说文件大小应该是512*512*4/1024=1024KB,结果我运行之后的结果却是5120KB,不懂,这是什么问题呢?
请大家帮忙,谢谢了
C++ C 矩阵
#include<iostream>
#include<time.h>
#include<windows.h>
#include<stdio.h>
using namespace std;
int main()
{
int t0,N;
DWORD dwGTCBegin, dwGTCEnd;
FILE *fp;
//int block,N;
if((fp=fopen("Matrix.txt","wt"))==NULL)
cout<<"error on open 'Matrix.txt'";
srand(0101);
cout<<"Please input the scale of matrix:";
cin>>N;
float *pMatrixA=new float[N*N];
float *pMatrixB=new float[N*N];
float *pMatrixC0=new float[N*N];
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
pMatrixA[N*i+j]=(float)rand();
pMatrixB[N*i+j]=(float)rand();
pMatrixC0[N*i+j]=0;
}
dwGTCBegin = GetTickCount();
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
pMatrixC0[N*i+j]+=pMatrixA[i*N+k]*pMatrixB[k*N+j];
dwGTCEnd = GetTickCount();
t0=dwGTCEnd - dwGTCBegin;
printf("Serial code running time: %d\n", t0);
//fwrite(pMatrixC0,sizeof(float),N*N,fp); //把生成的数组矩阵存放入Matrix.txt文件
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
fprintf(fp,"%f ",pMatrixC0[i*N+j]);
}
fclose(fp);
delete[]pMatrixA,pMatrixB,pMatrixC0;
system("pause");
return 0;
}
[解决办法]
"%f" 写的是字符串形式, 大小超过了 4 个字节了.
[解决办法]
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
[解决办法]
fprintf(fp,"%f ",pMatrixC0[i*N+j]);
这里是按照文本文件方式存储,把浮点数转换成字符串了呀。
每个浮点数占用多少字节是不固定的,比如0,1,2,等只占一个字节,加上空格共2个字节;
3.14加空格占用5个字节;
实际上任何类型的数据 fprintf ,printf都有可能改变数据占用的字节数。
很多时候都比用fwrite 存为二进制格式,占用的字节数要多!!!
fprintf ,printf
只有比较小的整数,实际是整数的浮点数,其他比较短的浮点数如0.5,和字符,字符串,才会不变或者变小。
fwrite 和内存中的数据占用空间,一样大小;