Why does fread sometimes return incorrect values?
조회 수: 11 (최근 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!