0

例如,以这个 IRB 会话为例:

1.9.3-p385 :046 > float = func_that_creates_large_float
=> 1.5815450433041317e+51 
1.9.3-p385 :047 > float.to_i
=> 1581545043304131697954259018410479150921451567054848

我可以确定返回给我的整数代表的值与浮点数相同吗?我问主要是因为 Ruby 文档将to_iFloat 类上的方法描述为“将浮点截断为整数”。“截断”这个词突然出现在我身上。

编辑:我认为描述我的情况可以清楚地说明我为什么要问这个问题。我试图取一个大整数的立方根,我知道它也会产生一个整数。立方根函数使用浮点数进行计算,将我的结果作为浮点数给出。我需要非科学符号值,但不知道如何处理。

谢谢你。

4

2 回答 2

1

相反,添加了(确定性但无意义的)数据(如您在代码示例中演示的那样)。您不会丢失任何信息。但它的价值不一样。

float的精度约为 17 位小数,您int的精度突然达到 51 位。这与Floating Point Arithmetic: Issues and Limitations相关。这种“精度”是十进制浮点值的二进制表示的结果,这导致了整数中一系列数字的“发明”。

考虑以下情况(在 Python 中,它遵循相同的规则,可能所有具有任意长整数的编程语言都如此):

>>> a = int(1.5815450433041317e+51)
>>> a
1581545043304131697954259018410479150921451567054848
>>> b = a + 10000000000000000
>>> a == b
False
>>> float(a) == float(b)
True
>>> a == 1.5815450433041317e+51
True

在 Python 中,该decimal模块将是一个很好的折衷方案:

>>> from decimal import Decimal, getcontext
>>> a = str(29873409852730498572309485723**3)  # just an arbitrary number
>>> getcontext().prec = 100
>>> cube = Decimal(a)
>>> cube ** Decimal("0.333333333333333333333333333333333333333333333333333333333
33333333333333333333")
Decimal('29873409852730498572309485722.99999999999999999999999999999999999999999
999998041297117811390088120595')

(由于表示1/3为十进制浮点数的问题,仍然有轻微的舍入误差,但结果很明显,不是吗?)

于 2013-08-03T21:10:08.973 回答
1

显然,如果有效数字的数量大于指数部分的大小,那么在浮点到整数的转换过程中您将丢失信息。

Ruby(像许多其他编程语言一样)没有可变精度浮点。相反,有效数字的数量固定为常数Float::DIG,默认为 15。这意味着,如果您的浮点数小于 10^15,那么在浮点数到整数的转换过程中您将丢失信息。


关于你关于整数内三次根的问题,最好在Rational课堂上进行计算。您无需担心截断。

(8 ** Rational("1/3")).to_r
# => (2/1)
于 2013-08-03T21:10:16.717 回答