Hello all,
I'm using dlmread to import datas and when the datas contains integers and float numbers, dlmread sometimes makes an error on the last digit of the output precision.
I'm not sure I am clear, so here is an example :
If my text file ('test.rpt') contains only the row :
1 10.8000 31. 10.5001
the command
A = dlmread('test.rpt')
gives back :
A =
1.000000000000000 10.800000000000001 31.000000000000000 10.500100000000000
I don't understand why this 10e-15 is added on the second number. Ok, it's not a big error, but it prevent me from easly comparing two values...
Does anyone know how to prevent this behaviour ?

6 件のコメント

dpb
dpb 2019 年 8 月 27 日
In short, you can't. It's fact of life with floating point numbers. See <Why-is-0-3-0-2-0-1-not-equal-to-zero?> for more explanation.
For comparison of floating point values with rounding error, see ismembertol
Adam Danz
Adam Danz 2019 年 8 月 27 日
編集済み: Adam Danz 2019 年 8 月 27 日
I wonder if you read it in as text and then convert it to numeric values, whether the problem would persist.
Arnaud WILHELM
Arnaud WILHELM 2019 年 8 月 27 日
Ok, I understand the problem of floating point numbers. But I don't remember seeing this when using fscanf and specifing a number format.
@ Adam : I am not sure I understand what you mean in "read it in as text" ?
Adam Danz
Adam Danz 2019 年 8 月 27 日
I know 0 about rpt files so I can't recommend alternative methods to read in the data. You're currently reading in the data usling dlmread (which has been replaced by readmatrix() starting in r2019a).
Some methods allow you to read in data as text in which case 10.8000 would be read as a string (or char array) '10.8000'. Then you could convert that to numeric by using str2double() or num2str() (the prior is better).
dpb
dpb 2019 年 8 月 27 日
> x=10.8
x =
10.8000
>> fprintf('%.15f\n',x)
10.800000000000001
>>
so it doesn't matter how you enter it, 10.8 is not exactly representable.
"I don't remember seeing this when using fscanf and specifing a number format."
Probably because you just didn't notice until you did try to do an exact comparison on floating point values.
>> fprintf('%.15f\n',round(x,1))
10.800000000000001
>>
It's doing the best it can within the constraints of IEEE floating point representation.
Adam Danz
Adam Danz 2019 年 8 月 27 日
編集済み: Adam Danz 2019 年 8 月 27 日
Ah, ok then. Thanks dpb & James Tursa .

サインインしてコメントする。

 採用された回答

James Tursa
James Tursa 2019 年 8 月 27 日
編集済み: James Tursa 2019 年 8 月 27 日

1 投票

Any function (dlmread, fscanf, etc) in any language (MATLAB, C, etc.) reading text numbers into floating point will have this issue. You may not have noticed it before, but it has always been there. With some exceptions (integers, etc), in general you simply can't represent many decimal numbers exactly in IEEE binary floating point format. For your numbers, here are the exact conversions:
>> sprintf('%.50f',1)
ans =
'1.00000000000000000000000000000000000000000000000000'
>> sprintf('%.50f',10.8)
ans =
'10.80000000000000071054273576010018587112426757812500'
>> sprintf('%.50f',31)
ans =
'31.00000000000000000000000000000000000000000000000000'
>> sprintf('%.50f',10.5001)
ans =
'10.50009999999999976694198267068713903427124023437500'
Integers (that are not too big) it does fine with, but your other decimal numbers cannot be represented internally exactly. Read the links that dpb has provided.

1 件のコメント

Arnaud WILHELM
Arnaud WILHELM 2019 年 8 月 28 日
All right, I understand now.
Thanks everyone for these anwsers !

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeData Import and Export についてさらに検索

製品

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by