【发布时间】:2018-01-24 14:34:18
【问题描述】:
我使用一个 C 库,它在两个 double 值上使用 pow 函数
double a = pow(b, c)
目前我有b = 0.62和c = 1504,这意味着a应该接近0(3.6e-312)。
但我有一个浮点异常。如何避免,直接返回0?我们可以预见这种情况吗?
我使用 64 位的 Debian 9,并使用 gcc 6.3 进行编译。该库是ccmaes,这是有问题的行:
https://github.com/CMA-ES/c-cmaes/blob/eda8268ee4c8c9fbe4d2489555ae08f8a8c949b5/src/cmaes.c#L893
我用过gdb所以浮点异常不是来自除法(t->chiN = 2.74)
如果我尝试使用 FPE 发生时的值来重现它,我没有问题(编译选项:-fopenmp -O3 -DNDEBUG -fPIC -Wall -Wextra -Wno-long-long -Wconversion -o,比如图书馆)
#include <math.h>
#include <stdio.h>
int main() {
double psxps = 5.6107247793270769;
double cs = 0.37564049253818982;
int gen = 752;
double chiN = 2.7421432615656891;
int N =8;
double foo = sqrt(psxps) / sqrt(1. - pow(1.-cs, 2*gen)) / chiN
< 1.4 + 2./(N+1);
printf("%lf\n",foo);
}
结果:1.00000000000
【问题讨论】:
-
@machine_1 我猜是“浮点异常”。
-
你确定你的异常是由于这条线吗?当我在家里尝试您的确切示例时,我得到 5.71612e-313。您能否提供有关您用于“pow”的库、您使用的编译器、在什么系统上等的更多详细信息?也许你应该尝试升级一些东西。浮点异常主要是由于除以 0。
-
这条“有问题的行”包含除法。哪个可以除以零。我不知道您是如何推断出问题出在
pow中的。 -
如果您采用您在问题中提出的行,请给它您在问题中提出的值并使用您在问题中陈述的编译器对其进行编译 - 它会给您例外吗?
标签: c floating-point numerical floating-point-exceptions