Tag: 下溢

用于高性能加法和乘法的常量forms

我需要在循环中有效地将一些常量添加或乘以double类型的结果以防止下溢。 例如,如果我们有int,则乘以2的幂会很快,因为编译器将使用位移。 有效的double加法和乘法是否有一种常量forms? 编辑:似乎没有多少人理解我的问题,为我的邋iness道歉。 我会添加一些代码。 如果a是int,则(乘以2的幂)将更有效 int a = 1; for(…) for(…) a *= somefunction() * 1024; 比1024更换为1023时。不确定如果我们想要添加到int中最好的是什么,但这不是我感兴趣的。 我对a是双倍的情况感兴趣。 我们可以有效地添加和乘以双精度的常数forms (例如2的幂)是什么? 常量是任意的 ,只需要足够大以防止下溢。 这可能不仅限于C和C ++,但我不知道更合适的标签。

计算多个数字的几何平均值的有效方法

我需要计算一大组数字的几何平均值,其值不是先验有限的。 天真的方式是 double geometric_mean(std::vector const&data) // failure { auto product = 1.0; for(auto x:data) product *= x; return std::pow(product,1.0/data.size()); } 但是,由于累积product的下溢或溢出,这可能会失败(注意: long double并不能真正避免这个问题)。 那么,下一个选项是总结对数: double geometric_mean(std::vector const&data) { auto sumlog = 0.0; for(auto x:data) sum_log += std::log(x); return std::exp(sum_log/data.size()); } 这可行,但为每个元素调用std::log() ,这可能很慢。 我可以避免吗? 例如,通过分别跟踪累积product的指数和尾数(相当于)?

什么时候发生下溢?

我遇到计算1.77e-308/10触发下溢exception的情况,但计算1.777e-308/10则没有。 这很奇怪,因为: 当浮点运算的真实结果的幅度(​​即,接近于零)小于目标数据类型中可表示为正常浮点数的最小值(来自算术下溢,维基百科)时,会发生下溢 换句话说,如果我们计算x/y和y都是double x/y ,那么如果0 < |x/y| < 2.2251e-308则会发生下溢0 < |x/y| < 2.2251e-308 0 < |x/y| < 2.2251e-308 (最小的正标准化double 2.2251e-308为2.2251e-308 )。 因此,理论上, 1.77e-308/10和1.777e-308/10都应触发下溢exception。 该理论与我在下面的C程序中测试的内容相矛盾。 #include #include #include int main(){ double x,y; // x = 1.77e-308 => underflow // x = 1.777e-308 gives ==> no underflow x=1.77e-308; feclearexcept(FE_ALL_EXCEPT); y=x/10.0; if (fetestexcept(FE_UNDERFLOW)) { puts(“Underflow\n”); } else […]