Floating point 计算器是如何精确工作的?
我想知道计算器是如何精确工作的。例如,Floating point 计算器是如何精确工作的?,floating-point,precision,calculator,Floating Point,Precision,Calculator,我想知道计算器是如何精确工作的。例如,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; } #包括 #包括 int main(){ 双x=sin(μPI); printf(“%
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;
}
#包括
#包括
int main(){
双x=sin(μPI);
printf(“%.20f\n”,x);//0.00000000000000012246
返回0;
}
现在我当然想在用户输入sin(π)时打印零。我可以很容易地在1e–15的某个地方找到这个特定的案例,但这是一个黑客,不是一个解决方案。当我开始像这样取整时,用户输入1e–20之类的值,他们会得到一个零(因为取整)。当用户输入1/10并反复点击=键时,也会发生同样的情况——当他到达取整树LD时,他得到零
然而,有些计算器返回sin(π)的纯零,同时可以轻松地处理(1e–20)/10等表达式。诀窍在哪里?他们可能正在使用查找表来加速他们的trig公式。在这种情况下,计算结果很好的特殊数字可能就在表中。桌面计算器使用任意精度的数学库。这些可以配置为具有更高的精度,而不是两倍的精度。手持计算器(传统专用和移动电话)使用固定精度的数学库 如果要精确打印零,请使用宽度说明符
printf (%12.4d, number);
在本页上可以找到一些答案 解决方案包括:
- 在BCD工作
- 使用查找表
- 使用隐藏数字,以便显示的数字准确无误
我还要补充一点,由于使用了算术,所以您的代码片段是这样工作的,正如您可能知道的,从某种意义上讲,算术不是真正的数学,它不精确-
1.0+0.1!=1.1
(实际上是1.10000000000001):您在谈论哪些计算器?例如,iPod和iPhone附带的计算器。取决于计算器。例如,Mathematica以任意精度计算(如其文档所述,如数字精度教程)。我肯定还有其他的计算器也有同样的功能,也有一些使用高精度(但不是任意精度)库,也许还有一些只是做常规浮点运算。@Mark:好吧,问题是关于软件计算器的,Mathematica只是同一概念的推广。不过,不管你如何定义“计算器”,很可能不同的计算器会使用不同的精度。@高性能标记:ubuntu上的默认计算器使用任意精度的数学库,因此我选择概括这个想法。BCD实际上并不比二进制更精确;其优点是它模仿铅笔和纸张的计算,因此可以获得完全相同的精度或不准确度,与BCD相比,还有一个不准确的来源:这是结果从基数2到基数10的转换。由十进制数字表示的相对精度(例如,六位有效数字)可能从约百万分之一(如果尾数为9.99999)到百万分之十(如果为10万)不等,几乎是十倍的变化。二进制浮点数的相对精度仅相差两倍。因此,为了使二进制表示法在所有情况下都与十进制表示法一样精确,在某些情况下必须是十进制表示法的十倍(如果不是二十倍的话)。不过,使用BCD并没有真正的帮助;为了确保所有中间计算的相对精度达到一定水平……在许多情况下,最终需要一个“额外”数字;即使如此,精度上的巨大差异也常常会导致自身的问题。