Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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_Integer_Decimal_Floating Accuracy_Fractions - Fatal编程技术网

Floating point 使用分数解决十进制数不准确的问题

Floating point 使用分数解决十进制数不准确的问题,floating-point,integer,decimal,floating-accuracy,fractions,Floating Point,Integer,Decimal,Floating Accuracy,Fractions,如果小数不能用二进制表示,那么为什么计算机不将数字存储为可以准确表示的两个整数的分数 每次使用数字显示某个位置时,它都可能被转换为不准确的浮点值 每次用于进一步计算时,都会包含分数 这应该从根本上解决不准确的问题,但这并不是所有的天才,那么这个理论有什么错呢 e、 g.您希望存储数字0.1并将其用于进一步计算。与其将其存储为0.1,不如将其存储为1/10(因此需要更多的字节来存储分数)。然后,如果你需要把它乘以另一个数字,比如说5,你现在也要把误差乘以3。如果你用1/10乘以3,你得到1/1

如果小数不能用二进制表示,那么为什么计算机不将数字存储为可以准确表示的两个整数的分数

  • 每次使用数字显示某个位置时,它都可能被转换为不准确的浮点值
  • 每次用于进一步计算时,都会包含分数
这应该从根本上解决不准确的问题,但这并不是所有的天才,那么这个理论有什么错呢


e、 g.您希望存储数字0.1并将其用于进一步计算。与其将其存储为0.1,不如将其存储为1/10(因此需要更多的字节来存储分数)。然后,如果你需要把它乘以另一个数字,比如说5,你现在也要把误差乘以3。如果你用1/10乘以3,你得到1/10*3=3/10。每当需要显示时,3/10可能会变得不准确。在那之前,不存在不准确的问题

小数并不重要。经典的用例是金钱,直到有人足够聪明,意识到你可以使用积分美分

重要的是要理解现实并不偏爱任何基础,当然也不偏爱从智人手指中位数得出的基础


至于比率,它们也不能表示
sqrt(2)
arctan(1)
。这些都是现实中出现的数字类型

除了不能使用无理函数(如
sqrt
(由MSalters提到)之外,还存在一个问题,即有理数很容易溢出(例如,尝试将两个数相乘,或使用牛顿法等迭代例程)。当然,您可以使用任意精度的整数,但这样做速度会很慢,而且您必须将这些大量的数字存储在内存中。

现有的浮点格式易于使用,计算速度快,并且易于在硬件中实现。它们也非常紧凑,这在创建格式时更为重要。尝试计算小于n的k的1/k之和,您将看到分母的大小(以位为单位)与n的指数关系。浮点格式为此类计算的结果保持恒定大小(以位为单位)。即使它是近似的,每个浮点计算都是在固定的绑定存储和固定的绑定时间内完成的,而“精确”分数则不是这样。我编写了一个BigRational类型,使用BigInteger作为分子和分母,通常,大整数一点也不大。你用它干什么?我写它是为了帮助我计算MacLaurin级数,以获得必要的精度。但它也可以作为自己的一种类型。注意,这不是用Java编写的,我用对象Pascal(和一些内置汇编程序)编写了BigInteger、BigDecimal和BigRational。