c++ - C++ 中的大数余弦相似度问题

标签 c++ precision long-integer

我正在写这个函数

double long CosineDistance(const vector<unsigned long>& a,const vector<unsigned long>& b){
  double long num = 0.0, den1 = 0.0, den2 = 0.0 ;
    for(int i = 0; i < a.size(); ++i) {
     num+=a[i]*b[i] ;
     den1+=a[i]*a[i] ;
     den2+=b[i]*b[i] ;
     } 
return num/(sqrt(den1)*sqrt(den2));
}

对于少量数据,它可以正常工作:

即传递 {1,3,8}{5,4,9} 返回 0.936686 (这是正确的)

现在我正在构建的项目使用大数字(它们是散列字符串)并使用类似的数字

{3337682107,92015386,2479056,2478761,4153082938}

{104667454,92015386,150359366,2225484100,2479056}

它返回给我 1,根据 WolframAlpha 的说法,我认为这是 0.968597 的近似值。

已经检查了溢出情况,但没有发生。

有办法解决这个问题吗?

谢谢

最佳答案

当您计算两个 vector ab 之间的余弦相似度时,以下情况成立:

CosineDistance(a*x,b*x) == CosineDinstance(a,b);

对于任何数字x(但不是0)。因此,您可以简单地使用 double 和适当的缩放因子x来避免溢出。

关于c++ - C++ 中的大数余弦相似度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37331388/

相关文章:

python - 如何在 python 和 C++ 中以毫秒为单位打印相同的时间?

python - 减少矩阵 SVD 中的舍入误差

java - 为什么多次加0.1仍然无损?

c++ - 为什么C++中的long long不能容纳2500^3

java - 使用Java从十六进制中提取64位数字

c++ - 使用 unique_ptr 管理三维数组

c++ - 如何在单次迭代中使用 C++ Pgm 中的指针查找字符串段落中单词的出现次数?

c++ - 使用 XCode 在 OSX 10.8 中编译 Mega.co.nz C++ SDK

c# - .NET 日期时间从字符串转换为日期时间时的毫秒精度问题

C字大小和标准大小