C++ 记忆、非理性与浮点数

C++ 记忆、非理性与浮点数,c++,c,memory,bits,C++,C,Memory,Bits,有些数字不能存储在“内存位”中,因为它们的二进制表示形式会使它们无休止地运行 在二进制文件11.111011110中。。。这不是确切的数字。我记不清现在到底是什么了 但我们可以把它想象成“一个无理数”,以10为基数,在小数点后无限延伸 一些有理数在转换为基数2时会遇到这个问题。 那么我们如何 1) 代表他们 2) 用计算机程序计算它们 3) 对它们进行操作 编辑: 要消除困惑并表示感谢: 好的,我在上面的帖子中说-->来查看它,或者认为它像一个无理数,或者像一个小数位数越来越长的数字。请读“喜欢

有些数字不能存储在“内存位”中,因为它们的二进制表示形式会使它们无休止地运行

在二进制文件11.111011110中。。。这不是确切的数字。我记不清现在到底是什么了

但我们可以把它想象成“一个无理数”,以10为基数,在小数点后无限延伸

一些有理数在转换为基数2时会遇到这个问题。 那么我们如何

1) 代表他们

2) 用计算机程序计算它们

3) 对它们进行操作

编辑: 要消除困惑并表示感谢:

好的,我在上面的帖子中说-->来查看它,或者认为它像一个无理数,或者像一个小数位数越来越长的数字。请读“喜欢”这个词

现在我有一个数字0.2,这个简单的数字不能用二进制形式表示。因此,如何对其执行操作

其他问题仍未解决

我对这里的人很有信心:


对于stackoverflow的极客来说,选择“library”或近似存储并不是一个答案,因为他们的某些应用程序必须保持数字的真实性

您应该了解浮点数标准,并阅读


在处理浮点数时,会有一些关于浮点数舍入及其精度的具体问题,正如您所说,我们无法在当前的机器中无限地表示它们,因此这些问题已经得到解决,以创造尽可能最好的精度,然而,在处理这些问题时,必须牢记一些注意事项

我们没有。我们使用它们的近似值。有一些算法可以以任何需要的精度计算它们

顺便说一句,不是每个无限长的数字都是无理的。例如,数字1/3以10为基数无限长:0.333。。。在基数2:0.0101010101…,但它是合理的。

没有通用的方法。 对于eaxmple,编号为:

sqrt(2) * sqrt(2)
可以通过符号或数字方法找到


关于有理数:我们可以将它们表示为一对(大)整数,并对它们执行算术运算。

如果你想表示有理数,你可以像在纸上一样,存储两个数字,分子和分母(当然,你最好找一个图书馆为你做这件事,因为有很多细微差别需要纠正)

没有有限基2表示的有理数是分母中没有2次幂的有理数,2是基的唯一素因子。同样,对于其他基,你需要查看基的素因子,因此对于基10,2次幂和5次幂的乘积具有有限表示


无理数是不同的动物,我认为与你的问题无关,这里的一般技术要么将它们近似到某个有限精度,例如M_PI,要么用符号表示它们,要么从不计算它们,要么在最后计算到有限精度。

所有整数都表示为特德说得很对。 你说的是分数和无理数,对吗

无理数不能像十进制数那样用二进制数来表示,所以它们只能用特定的精度来表示。 小数的问题在于,并不是每个十进制数都可以精确地表示为二进制数。例如0.9。这是因为浮点数的性质

解决这个问题最简单的方法是使用定点数字——它是基本整数,有些数字固定表示小数部分。这种方法通常用于金融软件/每一美元都用100美分表示)这种方法有一个缺点——它只能表示有限的数字精度


另一种解决方案类似于十进制周期数。将它们表示为两个数字,即被除数和除数。因此,十进制周期0.(3)可以精确地表示为1和3。

具有有限十进制表示的数字在二进制中没有一个是重复的,而不是无理的。你如何处理这些问题取决于你的需要。如果你在处理钱的问题,你通常使用二进制编码的十进制或比例表示法,这保证了加法和减法精确到一定的小数位数。在其他字段中,您可能会使用符号表示,以便在需要时延迟执行实际计算。如果你想一想,sqrt(2)是一个有限的、精确的表示,只要你不实际计算它。

它们不是无理数,它们是周期数。1/3是十进制的周期数。1/10是二进制的周期数。两者都是理性的(独立于基础)。事实上,一个数字是否合理与基数无关

所有有理数都可以表示为分数,其中分子和分母都是整数。是的,包括所有定期的。一些系统内部使用分数来提供更高的精度。我相信这就是Perl6将要使用的而不是浮点数

你可以在内部得到非常大的数字,在处理无理数时仍然会有精度损失。例如,您只能使用近似的pi

 314159265358979/100000000000000


可能会看到:您给出的“11.110110…”示例根据您使用的系统的精度进行四舍五入。11.1110111101110…=59/15,顺便说一句,完全合理。很容易用59和15这两个数字来表示。@ASHISH你似乎把无理数和数字混为一谈,在某种基础上用无限表示,这可能是合理的。为了找到最接近浮点数的合理有理近似值,我认为最好的结果来自连分数,在第一个“大”处截断
3141592653589793/1000000000000000