Why does fread sometimes return incorrect values?
14 次查看(过去 30 天)
显示 更早的评论
I regularly use MATLAB to analyse data generated elsewhere. Most commonly, I work with int16s and single precision floats.
However, I recently needed to use (64-bit) doubles. Some values read back fine, but others don't.
For example, if in my C code, I generate and save this number to file:
double x = -3.0 * cos(M_PI * 3.0 / 8.0);
then MATLAB correctly reads back the value (approx) -1.1481 from the file. If I interpret the file as uint64, then both C and MATLAB agree that this is:
MATLAB: 1.3831e+19
C: 13831221214917623563
However, if in my C code, I generate and save this number to file:
double x = -3.0 * cos(M_PI * 5.0 / 8.0);
then MATLAB reads back -8.1120e+242 instead of (precisely) 1.148050297095269289827. Furthermore, MATLAB and C now disagree about the uint64 interpretation:
MATLAB: 1.7465e+19
C: 4607849178062847754 (= 0x3ff25e69fd02ff0a)
As shown in this online tool, 0x3ff25e69fd02ff0a is the correct hex representation of 1.148050297095269289827.
What am I doing wrong?
5 个评论
Guillaume
2019-3-26
by default, fread() casts to double. This isn't the problem.
Hum, it can be, any uint64 > 9007199254740992 (flintmax) may be rounded when converted to double.
采纳的回答
Harry
2019-3-26
编辑:Harry
2019-3-26
3 个评论
Walter Roberson
2019-3-27
The conventions in MATLAB and C are opposite. In MATLAB, fopen expects binary unless you use the 't' permission, whereis in C, fopen expects text unless you use the 'b' permission. It is easy to get a mismatch when going between the two programming languages.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Data Type Conversion 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!