当执行算术时,代码会给出不寻常的结果

2024-10-04 11:32:45 发布

您现在位置:Python中文网/ 问答频道 /正文

Python脚本似乎做了不正确的算术运算。你知道吗

import _thread
import time

def mult(pixel : int, multiplier : tuple) -> float:
    "multiplies either r,g,b pixel by row vector (0.257, 0.504, 0.098),(-0.148,-0.291,0.439),(0.439,-0.368,-0.071))"

    sum=0
    for mul in multiplier:
        sum += (pixel * mul)
        print(sum)
    return sum

redMul = [0.257, 0.504,0.098]
greenMul = [-0.148, -0.291, 0.439]
blueMul = [0.439, -0.368,-0.071]

redAdd = 16
greenAdd = 128
blueAdd = 128

try:
   _thread.start_new_thread(mult,(1,blueMul))
except:
    print("Error: unable to start thread")

代码输出:

0.439
0.07100000000000001
1.3877787807814457e-17

期望时:

0.439 
0.071
0

此错误的原因是什么?如何解决?你知道吗


Tags: import脚本timedef算术threadstartint
2条回答

sum = round(sum, 3))

将float限制为3个小数点,然后执行算术

def mult(pixel : int, multiplier : tuple) -> float:
    "multiplies either r,g,b pixel by row vector (0.257, 0.504, 0.098),(-0.148,-0.291,0.439),(0.439,-0.368,-0.071))"

    sum=0
    for mul in multiplier:
        sum += (pixel * mul)
        sum = round(sum, 3)
        print(sum)
    return sum

Python脚本不会执行错误的算法,它只是浮点算法的方式。你知道吗

使用float(Python中的双浮点精度)时需要注意的主要原则是,它是实际值的近似值。除非这个值的分母是2次方,比如1,2,4,0.5,0.25等等,否则这个值不能用float精确地表示。它总是近似值,直到第15/16位。你知道吗

因此,所有结果:

0.439
0.07100000000000001
1.3877787807814457e-17

是正确的。。。最高达15/16位有效数字,即:

0.439
0.0710000000000000
0.000000000000000 #(thus you have 1 e-17 as your 17-th digit)

float不保证精度超过第15/16位

如果您确实需要比第15-16位更高的精度,请考虑使用decimal

相关问题 更多 >