【发布时间】:2011-02-12 09:46:58
【问题描述】:
我想知道计算器如何精确地工作。例如,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;
}
现在我当然想在用户输入 sin(π) 时打印零。我可以轻松地在 1e–15 上的某个地方四舍五入,以使这个特定案例工作,但这是一个 hack,而不是解决方案。当我开始像这样四舍五入并且用户输入类似 1e-20 的内容时,他们得到一个零(因为四舍五入)。当用户输入 1/10 并反复按 = 键时,也会发生同样的情况 — 当他达到舍入阈值时,他得到零。
然而,有些计算器会为 sin(π) 返回纯零,同时它们可以轻松地处理诸如 (1e–20)/10 之类的表达式。诀窍在哪里?
【问题讨论】:
-
你在说哪些计算器?
-
例如 iPod 和 iPhone 附带的计算器。
标签: floating-point precision calculator