Numerical error representing data in Format Long

9 次查看(过去 30 天)
Dear all,
I have had a surprise making with this simple multiplication:
>> format long
>> 10e3*820e-12
ans =
8.199999999999999e-06
The result must be 8.2e-6!!!
I have the correct result doing before "format short":
>> format short
>> 10e3*820e-12
ans =
8.2000e-06
The answers based in the binary nature of the machine and rounding, doesn't convince me in this case.
Is this a bug???
Best regards,
Javier

采纳的回答

Stephen23
Stephen23 2020-5-27
编辑:Stephen23 2020-5-27
"I have had a surprise making with this simple multiplication:"
Nothing in that result is surprising.
"The result must be 8.2e-6!!!"
In fact the result cannot be exactly 8.2e-6, simply because there is no such value in (double) binary floating point. The closest value is actually (here I used James Tursa's excellent FEX submission num2strexact):
>> N = 8.2e-6;
>> num2strexact(N)
ans =
8.19999999999999941717628015869223645495367236435413360595703125e-6
The closest representable value on the other side is:
>> num2hex(N)
ans =
'3ee132576b20e04a'
>> num2strexact(hex2num('3ee132576b20e04b'))
ans =
8.200000000000001111242174667292914591598673723638057708740234375e-6
So, it is clear that your expected value cannot be exactly represented using double floating point.
Lets now have a look at the input value which also cannot be exactly representated by double floating point numbers:
>> num2strexact(820e-12)
ans =
8.1999999999999996008103761454643802764064020038858870975673198699951171875e-10
and the actual product of those two values:
>> num2strexact(10e3*820e-12)
ans =
8.19999999999999941717628015869223645495367236435413360595703125e-6
So far nothing unexpected, in fact I'm impressed that the multiplication gave the nearest representable value.
"I have the correct result doing before "format short":"
It is not more nor less correct than the long format, just exactly the same value stored in memory displayed to a different number of significant digits. Changing the displayed decimal precision makes absolutely no difference the the value stored in memory, nor does it make any difference to the binary precision of that value stored in memory.
"The answers based in the binary nature of the machine and rounding, doesn't convince me in this case."
Two questions:
  1. given that one of your input values and also the expected result cannot be exactly represented by double floating point numbers, how do you expect them to be exactly represented by double floating point numbers?
  2. If this is not a behavior that you think is due to the nature of binary floating point numbers, then what are the obeservable behaviors of binary floating point numbers? Should they behave like the numbers you learned about at school?
"Is this a bug???"
No.
  2 个评论
SwadFX
SwadFX 2020-5-27
Ok, I didn't realize that Format Short was rounding.
Thank you very much
Stephen23
Stephen23 2020-5-27
编辑:Stephen23 2020-5-28
"I didn't realize that Format Short was rounding."
All display formats perform rounding, the only difference is the number of significant digits.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by