2016-03-29 3 views
2

Есть интересный вопрос о Facebook, с которым я столкнулся. Он спрашивает, что он использует MATLAB R2014a (64-разрядная версия) и побежал этот код: -Зачем исправить ((20.45-20) * 60) не равно с исправлением ((20) * 60) в MATLAB

x = 0.45; 
min = fix((x)*60); 
fprintf('min = %d \n', min); 

x = 20.45 
min = fix((x-20)*60); 
fprintf('min = %d \n', min); 

Результаты следующие:

>> tx 
min = 27 
min = 26 

, которые неверны, потому что (20.45 - 20) должны дать тот же результат, что и 0,45, но это не так.

Он также пытался% f, но он все же дал тот же результат.

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

Итак, я думаю, что этот вопрос интересен и сложный. Может ли кто-нибудь помочь мне объяснить, как это происходит?

Where the answers are not equal.

Спасибо!

+3

Да, это ошибка хранения плавающей запятой. '0.45' не' 20.45-20' –

+2

Полезная лекция: https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – liori

+5

Самый близкий к 0.45 - 0.450000000000000011102230246251565404236316680908203125, немного больший, чем точный , Самый близкий к 20.45 - 20.449999999999999289457264239899814128875732421875, немного меньше точного. 20.45-20 оценивается как: 0.449999999999999289457264239899814128875732421875 –

ответ

2

Проблема вы видите это сделать с хранения чисел с плавающей запятой, см:

20.45-20==0.45 

Когда вы делаете расчет в вашей голове, он выходит то же самое, но в компьютере, он не видит this question for more details