Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Floating point 计算器是如何精确工作的?_Floating Point_Precision_Calculator - Fatal编程技术网

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并没有真正的帮助;为了确保所有中间计算的相对精度达到一定水平……在许多情况下,最终需要一个“额外”数字;即使如此,精度上的巨大差异也常常会导致自身的问题。