Результат изменения порядка умножения. Почему?

В настоящее время мы экспериментируем с числами с плавающей запятой и столкнулись с программой на Фортране, где не смогли понять, что происходит.

program test
a=0.1
print*, a * .1 * 10.
print*, .1 * a * 10.
print*, .1 * 10. * a
end program test

Вопрос: почему он дает разные результаты?

0.100000009  
0.100000009  
0.100000001

Мы думаем, что это может быть как-то связано с моделью представления чисел с плавающей запятой (мантисса, экспонента,...) и с тем, как компьютер округляет числа, но мы не уверены.

Кто-нибудь может подробно объяснить, как это работает?


person Dan    schedule 01.05.2017    source источник
comment
stackoverflow.com/questions/19820297/ - другой язык, (вероятно) та же причина   -  person JJJ    schedule 01.05.2017
comment
Ошибки округления, вызванные двоичным представлением мантиссы. Эти ошибки очень сильно зависят от порядка множимых.   -  person Paul Bentley    schedule 01.05.2017