multiprocessing.Value不能正确存储浮点数

时间:2018-08-09 13:24:22

标签: python multiprocessing python-multiprocessing

我尝试将浮点数分配给multiprocessing.Value共享ctype,如下所示:

import multiprocessing
import random

test_float = multiprocessing.Value('f', 0)
i = random.randint(1,10000)/(random.randint(1,10000))
test_float.value = i
print("i: type = {}, value = {}".format(type(i), i))
print("test_float: type = {}, value = {}".format(type(test_float.value), test_float.value))
print("i == test_float: {}".format(i == test_float.value))

但是,存储在multiprocessing.Value中的float是!=输入float:

>>> i: type = <class 'float'>, value = 1.480021216407355
>>> test_float: type = <class 'float'>, value = 1.4800212383270264
>>> i == test_float: False

这是什么问题?

编辑: 找到了解决方案(请参阅答案)但是,我不明白,为什么这里的“ double”是正确的类型而不是“ float”。如果有人可以详细说明并提供解决方案,我将其标记为正确答案。

2 个答案:

答案 0 :(得分:2)

解决方案是将typecode_or_type中的multiprocessing.Value设置为双精度:

test_float = multiprocessing.Value('d', 0)

允许使用multiprocessing.Value的类型代码:

Type code     C Type          Python Type     Minimum size in bytes
'b'       signed char     int             1
'B'       unsigned char   int             1
'u'       Py_UNICODE      Unicode character 2 (see note)
'h'       signed short    int             2
'H'       unsigned short  int             2
'i'       signed int      int             2
'I'       unsigned int    int             2
'l'       signed long     int             4
'L'       unsigned long   int             4
'f'       float           float           4
'd'       double          float           8

来自the documentation

答案 1 :(得分:1)

Python浮点数为double-precision floats,或其他语言称为double的浮点数。这就是为什么您需要使用'd'的原因:'f'与python用于float的精度级别不符