0

我需要使用一个对整数进行一些数学运算的模块,但是我的输入是浮点数。

我想要实现的是将通用浮点值转换为相应的整数值并尽可能少地松散数据。

例如:

val : 1.28827339907e-08
result : 128827339906934

这是乘以 1e22 后实现的。

不幸的是,值的范围可以改变,所以我不能总是将它们乘以相同的常数。有任何想法吗?

添加
换句话说,我有一个值 < 1 的矩阵,比如说 from1.323224e-83.457782e-6

我想将它们全部转换为整数并尽可能少地释放数据。

4

4 回答 4

2

如果您想保留矩阵运算的值,我会选择一些值将它们全部乘以。

例如:

1.23423
2.32423
4.2324534

将它们全部乘以 10000000,你得到

12342300
23242300
42324534

您可以使用矩阵执行乘法、加法等。执行完所有计算后,您可以根据您执行的操作将它们全部除以适当的值,从而将它们转换回浮点数。

从数学上讲,这是有道理的,因为

(Scalar multiplication)
M1` = M1 * 10000000   
M2` = M2 * 10000000

Result = M1`.M2`
Result = (M1 x 10000000).(M2 x 10000000)
Result = (10000000 x 10000000) x (M1.M2)

因此,在乘法的情况下,您可以将结果除以 10000000 x 10000000。

如果它的加法/减法,那么你只需除以 10000000。

您可以通过对期望找到的小数的了解来选择要乘以的值,也可以通过扫描浮点数并在运行时自己生成值。

希望有帮助。

编辑:如果您担心超过整数的最大容量 - 那么您会很高兴知道 python 在发现溢出时会自动(并且默默地)将整数转换为长整数。您可以在 python 控制台中亲自查看:

>>> i = 3423
>>> type(i)
<type 'int'>
>>> i *= 100000
>>> type(i)
<type 'int'>
>>> i *= 100000
>>> type(i)
<type 'long'>

如果您仍然担心溢出,您总是可以选择一个较低的常数,但会稍微降低准确性(因为您将在小数点末尾丢失一些数字)。

此外,Eric Postpischil 提出的方法似乎是有道理的——但我自己还没有尝试过。我从更数学的角度给了你一个解决方案,这似乎也更“pythonic”

于 2013-09-05T14:21:35.127 回答
2

建议乘以十次方的答案会导致不必要的舍入。

只要没有上溢或下溢,乘以浮点表示中使用的基数的幂在 IEEE 754 算术(最常见的浮点实现)中没有错误。

因此,对于二进制浮点,您可以通过将浮点数乘以 2 的幂并将结果四舍五入到最接近的整数来实现您的目标。乘法不会有错误。显然,四舍五入到整数可能有高达 0.5 的误差。

您可以选择尽可能大的 2 的幂,而不会导致任何数字超出您正在使用的整数类型的范围。

浮点到整数的最常见转换截断,因此 3.75 变为 3。我不确定 Python 语义。要舍入而不是截断,您可以使用一个函数,例如round在转换为整数之前。

于 2013-09-05T15:18:40.203 回答
0

也许考虑计算每个值的小数点后位数以确定x指数 ( ) 的值 ( 1ex)。大致类似于这里提到的内容。干杯!

于 2013-09-05T14:18:22.180 回答
0

这是一个解决方案:

def to_int(val):
    return int(repr(val).replace('.', '').split('e')[0])

用法:

>>> to_int(1.28827339907e-08)
128827339907
于 2013-09-05T14:19:38.490 回答