下面的代码(用于计算余弦相似度),在我的电脑上反复运行时,会输出1.0、0.9999999999999998或1.0000000000000002。当我去掉normalize函数时,它只会返回1.0。我以为浮点运算应该是确定性的。如果同样的操作在同一台计算机上应用于相同的数据,那么这在我的程序中会引起什么问题?也许与normalize函数被调用的堆栈位置有关吗?我该如何避免这种情况发生?
#! /usr/bin/env python3
import math
def normalize(vector):
sum = 0
for key in vector.keys():
sum += vector[key]**2
sum = math.sqrt(sum)
for key in vector.keys():
vector[key] = vector[key]/sum
return vector
dict1 = normalize({"a":3, "b":4, "c":42})
dict2 = dict1
n_grams = list(list(dict1.keys()) + list(dict2.keys()))
numerator = 0
denom1 = 0
denom2 = 0
for n_gram in n_grams:
numerator += dict1[n_gram] * dict2[n_gram]
denom1 += dict1[n_gram]**2
denom2 += dict2[n_gram]**2
print(numerator/(math.sqrt(denom1)*math.sqrt(denom2)))