gpt4 book ai didi

c++ - 使用icc编译器的 float 异常

转载 作者:行者123 更新时间:2023-11-27 22:30:46 27 4
gpt4 key购买 nike

我正在通过以下命令编译我的代码:

icc -ltbb test.cxx -o test

然后当我运行程序时:

time ./mp6 100 > output.modified
Floating exception
4.871u 0.405s 0:05.28 99.8% 0+0k 0+0io 0pf+0w

我收到“ float 异常”。以下是异常前后的 C++ 代码:

// before
if (j < E[i]) {
temp += foo(0, trr[i], ex[i+j*N]);
}

// after
temp += (j < E[i])*foo(0, trr[i], ex[i+j*N]);

这是 boolean 代数...所以 (j < E[i]) 要么是 0 要么是 1 所以乘法结果要么是 0 要么是 foo() 结果。我不明白为什么这会导致 float 异常。这就是 foo() 所做的:

int foo(int s, int t, int e) {
switch(s % 4) {
case 0:
return abs(t - e)/e;
case 1:
return (t == e) ? 0 : 1;
case 2:
return (t < e) ? 5 : (t - e)/t;
case 3:
return abs(t - e)/t;
}
return 0;
}

foo() 不是我写的函数,所以我不太确定它的作用……但我认为问题不在于函数 foo()。关于 boolean 代数,有什么我不理解的,或者在 C++ 中的工作方式与我所知道的不同吗?知道为什么这会导致异常吗?

谢谢,赫里斯托

最佳答案

您几乎可以肯定在 foo 中除以零。

一个简单的程序

int main()
{
int bad = 0;
return 25/bad;
}

也打印

Floating point exception

在我的系统上。

因此,当s % 4 为零时,您应该检查e 是否为0,或者当s 时,t 是否为0 % 4 是 2 或 3。然后返回对您的情况有意义的任何值,而不是尝试除以零。


@hristo:即使左侧为零,C++ 仍会评估乘法的右侧。结果 应该为零并不重要; foo 被调用和评估并导致错误很重要。

样本来源:

#include <iostream>
int maybe_cause_exception(bool cause_it)
{
int divisor = cause_it ? 0 : 10;
return 10 / divisor;
}

int main()
{
std::cout << "Do not raise exception: " << maybe_cause_exception(false) << std::endl;

int x = 0;

std::cout << "Before 'if' statement..." << std::endl;

if(x)
{
std::cout << "Inside if: " << maybe_cause_exception(true) << std::endl;
}

std::cout << "Past 'if' statement." << std::endl;

std::cout << "Cause exception: " << x * maybe_cause_exception(true) << std::endl;

return 0;
}

输出:

Do not raise exception: 1

Before 'if' statement...

Past 'if' statement.

Floating point exception

关于c++ - 使用icc编译器的 float 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2752499/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com