Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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
用Python实现机器精密跨平台_Python_Numpy - Fatal编程技术网

用Python实现机器精密跨平台

用Python实现机器精密跨平台,python,numpy,Python,Numpy,我正在进行数值模拟,由于机器精度问题,在不同的平台上得到了不同的结果。举一个简单的例子(我不认为实际上失败了,但可以): 将numpy导入为np np.random.seed(seed=42) VAL=np.rand.rand(int(1e5)) 阈值=0.5 有效值=np,其中(有效值>阈值) 尽管我已经为随机数生成器设定了种子,但由于机器精度的不同,可能会有非常接近阈值的值在一个系统上的计算结果高于阈值,而不是在另一个系统上。有没有标准的方法来处理这个问题?一种解决方案是强制对取整整数进行

我正在进行数值模拟,由于机器精度问题,在不同的平台上得到了不同的结果。举一个简单的例子(我不认为实际上失败了,但可以):

将numpy导入为np
np.random.seed(seed=42)
VAL=np.rand.rand(int(1e5))
阈值=0.5
有效值=np,其中(有效值>阈值)

尽管我已经为随机数生成器设定了种子,但由于机器精度的不同,可能会有非常接近阈值的值在一个系统上的计算结果高于阈值,而不是在另一个系统上。有没有标准的方法来处理这个问题?

一种解决方案是强制对取整整数进行比较。我可以上新课

类整数(对象):
定义初始值(自我、无效、刻度=1e5):
self.initial=无效
self.value=np.round(无效*刻度)。aType(整数)
self.scale=scale
定义(自身、其他):
返回self.value>other.value
定义(自身、其他):
返回self.value
然后我可以做比较

good_vals = np.where(int_rounded(vals) > int_rounded(threshold))

这似乎迫使跨平台的结果相同,但我怀疑有一些故障模式我没有遇到。

如果依赖于系统相关的默认值,则使用显式数据类型?在两个系统上都设置为float64,因此我想我需要定义一个新的类似float的数据类型来强制相同的计算。对不起,你是什么意思?我不明白你的前提是如何得出结论的。它们已经是相同的数据类型了。我不认为显式设置数据类型会改变行为?除非有一种我不知道的数据类型,它强制跨平台使用相同的精度。你确定这只是数值精度吗?随机不保证是可复制的(参见)顺便问一下,你们的两个平台是什么?Linux/win/mac?您是否也更改了python版本?一个明显的问题是,如果您比较的浮点值远远大于int的最大值。因此,可能需要更多的检查,但由于这是可行的,而且没有人提出更好的方案,我接受了。