Tag: 浮点exception

双打遭遇溢出吗?

是否可以使用double或float进行溢出(环绕)? 如果在x86或x64硬件上达到最大(或最小)值,会发生什么?

什么时候发生下溢?

我遇到计算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 […]

为什么整数除以-1(负一)导致FPE?

我的任务是表达一些看似奇怪的C代码行为(在x86上运行)。 我可以很容易地完成其他所有事情,但是这个让我很困惑。 代码段1输出-2147483648 int a = 0x80000000; int b = a / -1; printf(“%d\n”, b); 代码片段2不输出任何内容,并提供Floating point exception int a = 0x80000000; int b = -1; int c = a / b; printf(“%d\n”, c); 我很清楚代码片段1( 1 + ~INT_MIN == INT_MIN )的结果的原因,但我不太明白整数除法-1如何生成FPE,也不能在我的Android手机上重现它(AArch64 ,海湾合作委员会7.2.0)。 代码2只输出与代码1相同,没有任何例外。 它是x86处理器的隐藏bugfunction吗? 该任务没有告诉任何其他内容(包括CPU架构),但由于整个课程基于桌面Linux发行版,您可以放心地假设它是一个现代的x86。 编辑 :我联系了我的朋友,他在Ubuntu 16.04(Intel Kaby Lake,GCC 6.3.0)上测试了代码。 结果与所指定的任何内容一致(代码1输出所述内容,代码2与FPE崩溃)。