不得不吐槽 C++ 不是很友好
常见问题1.
误用 unsigned 类型造成数组越界检查失败
#include <vector> #define ARR std::vector<double> double normalize( const ARR & arrx, const ARR & arry, size_t indref){ size_t indl = indref; double valtmp = arry[indl]; double sum = 0; while ( indl >= 0 && valtmp > 1.0e-5) sum += arry[indl--]; return sum; }
非常丢脸的没有意识到 size_t 值不会小于〇,造成数组越界检查失败。不过 C++ 编译和执行的错误提示实在不友好,一点指示性都没有,花了几个小时才发现问题出在哪里。
问题2.
std::inner_product 计算错误,最近尝试写一下算相关系数的代码,调用标准库中的 std::inner_product 函数来计算相关系数。结果两个完全相同的序列,相关系数竟然和1差很远,但是自己写一小段代码计算的结果就没问题。疑惑好久
double r = std::inner_product(arrfrom, arrend, brrfrom, 0); double r = 0; while(arrfrom != arrend) r += *arrfrom++ * *brrfrom++;
然后发现如果最后的单位是整形的话,inner_product 会把两个向量的数据类型当成整形。只有写成 0.0 才会当成浮点型。不知道什么样的脑残逻辑才设计成这样啊。
double r = std::inner_product(arrfrom, arrend, brrfrom, 0.0);
这样写才能得到正确的结果。
Visits: 387