Округление с плавающей точкой - PullRequest
2 голосов
/ 21 марта 2012

Я пишу код на C ++ и определил PI как:

const double MathConstants::PI = atan(1.0)*4.0;

Иначе, где в моем коде я установил переменную с плавающей запятой:

float result = (float) (-MathConstants::PI / 2.0);

Когда я печатаю значениерезультата в памяти я получаю DB 0F C9 BF с прямым порядком байтов.Преобразуется в старшее число, то есть BF C9 0F DB.

Согласно http://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html, что эквивалентно -1.5707964.

Что я не понимаю, так это почему я получаю -1.5707964вместо -1,5707963.-1.5707963 - это результат, который я ожидал, поскольку -PI / 2 равен -1.5707963267948966.

Может ли кто-нибудь просветить меня здесь?

1 Ответ

4 голосов
/ 21 марта 2012

Округление является двоичным, а не десятичным.Когда вы смотрите на результат в десятичном формате, он кажется неправильным, потому что вы ожидаете, что он округляет конечную десятичную цифру, но это не то, что он делает.Он округляет последний двоичный бит.

Я ввел 1,57079632679489661923132169163975 в качестве константы для PI / 2 в указанную вами ссылку, и он выдал правильный результат 1,5707964.

Сравните 64-битное представлениев 32-битное представление:

1 .1001001000011111101101010100010001000010110100011000
1 .10010010000111111011011

Обрезанная часть начиналась с 1, поэтому для правильного округления требовалось увеличить 32-битный результат.

...