2015-10-23 3 views
0

В MATLAB верно следующееПочему 0,1 * 10,0 == 1

0.1 * 10.0 == 1 

Но 0,1 не представляется именно с плавающей точкой, так что я ожидал, что это не может быть правдой. Неужели мне просто повезло, и ошибка оказалась меньше, чем eps, поэтому она округлилась до 1?

MATLAB реализует IEEE 754, поэтому я считаю, что он должен применяться ко всем языкам. Но это post заставляет меня думать, что это может быть что-то особенное для MATLAB.

+1

Python действительно оценивает true: >>> 0.99999999999999999 == 1 – ergonaut

+0

Возможно, вам повезло, что да. Этот пост может обеспечить более глубокое понимание: http://stackoverflow.com/questions/686439/why-is-24-0000-not-equal-to-24-0000-in-matlab – rayryeng

+0

'0.1 + 0.2 + 0.3 - 0.6 = 1.110223024625157e-16' while '0.1 + 0.2 + 0.3 + 0.4 - 1.0 = 0.0' (R2012b) :-) –

ответ

9

Ваш конкретный пример верен для любого языка, который использует арифметику с плавающей точкой IEEE754 (ну, по крайней мере, по 64 бита).

Буквальная 0.1 точно

0.1000000000000000055511151231257827021181583404541015625 

10.0 ровно 10

Их продукт поэтому

1.000000000000000055511151231257827021181583404541015625 

двух ближайших значений с плавающей точкой являются:

1.0 
1.000000000000000222044604925031308084726333618164062 

, из которых первый ближе всего, поэтому результат округляется до этого.

(я не уверен на 100%, что происходит в этом примере вы ссылаетесь на: Я подозреваю, что это связано с C# с помощью higher intermediate precision)

В целом, однако, такого рода вещи не правда. например 0.51255*1e5 не является 51255 (хотя MATLAB может лежать при печати, попробуйте 0.51255*1e5-51255).