Как управлять вычислениями двойной точности, чтобы избежать ошибок округления в C ++ linux x86_64? - PullRequest
1 голос
/ 25 декабря 2011

В коде C ++ на Linux x86_64 мне нужно вычислить с двойной точностью (+ или -).

26,100000000000001 - 26 + 0,10000000000000001

Я получил:

0,20000000000000143

Я хочу получить 0,2.

здесь, формат отображения не импортируется, результаты вычислений будут использоваться для некоторых условий перехода if-else. Поэтому я хочу, чтобы условия if-else сравнивали 4 цифры после десятичной цифры.

Кажется, ошибка округления?

Как ограничить точность вычислений до 4 цифр после десятичной точки?

Я не хочу вызывать какие-либо функции, чтобы избежать накладных расходов.

Я не хочу использовать stringstream из-за затрат на преобразование.

Есть идеи получше?

спасибо

Ответы [ 3 ]

8 голосов
/ 25 декабря 2011

Точность вычислений в порядке.Это точность отображения , которую вы пытаетесь контролировать.Вы можете сделать это с помощью setprecision(), если используете <iostream>, или форматера, подобного "%.4f", если используете <stdio.h>.

. Вы уже вызываете функции, поскольку отображает результат какдесятичное число!

PS 0.1 не может быть точно представлено в формате float, double или в любом двоичном формате мантиссы.Он учитывает (1/2) * (1/5), а десятичная 1/5 - это бесконечно повторяющаяся последовательность цифр в двоичном формате.

PPS. Посмотрите на GMP .Это может быть вашей лучшей надеждой.

2 голосов
/ 25 декабря 2011

Если вы просто хотите распечатать его, вы можете использовать printf ("% 10.4lf"). Конечно, вы можете изменить точность на что угодно.

1 голос
/ 26 декабря 2011

Если вас интересует равенство до четырех десятичных знаков, умножьте все на 10000 и используйте целочисленную арифметику. (Вам может потребоваться округлить после умножения на 10000.)

...