Как калькуляторы работают с точностью? - PullRequest
8 голосов
/ 26 апреля 2010

Интересно, как калькуляторы работают с точностью. Например, значение sin(M_PI) не совсем равно нулю при вычислении с точностью double:

#include <math.h>
#include <stdio.h>

int main() {
    double x = sin(M_PI);
    printf("%.20f\n", x); // 0.00000000000000012246
    return 0;
}

Теперь я, конечно, хотел бы вывести ноль, когда пользователь вводит грех (π). Я легко могу округлить где-нибудь на 1e – 15, чтобы заставить этот конкретный случай работать, но это взлом, а не решение. Когда я начинаю округлять, как это, и пользователь вводит что-то вроде 1e – 20, он получает ноль обратно (из-за округления). То же самое происходит, когда пользователь вводит 1/10 и неоднократно нажимает клавишу = - когда он достигает порога округления, он получает ноль.

И все же некоторые калькуляторы возвращают простой ноль для sin (π), и в то же время они могут комфортно работать с такими выражениями, как (1e – 20) / 10. Где трюк?

Ответы [ 4 ]

6 голосов
/ 26 апреля 2010

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

Если вы хотите напечатать ровно ноль, используйте спецификатор ширины

printf (%12.4d, number);
4 голосов
/ 26 апреля 2010

Некоторые ответы можно найти на этой странице Точность калькулятора .

Среди решений:

  • работа в BCD
  • использовать справочные таблицы
  • использовать скрытые цифры, чтобы отображаемые цифры были точными
2 голосов
/ 26 апреля 2010

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

Я бы также добавил, что ваш кодФрагмент работает так благодаря использованию арифметики с плавающей точкой , которая, как вы, вероятно, знаете, не true математика в том смысле, что она не точна - 1.0 + 0.1 != 1.1 (на самом деле это 1.1000000000000001):)

2 голосов
/ 26 апреля 2010

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

...