标签: floating-point-exceptions

Visual Studio C++ 2008/2010 - 在float NaN上打破

有没有办法设置Visual Studio(刚刚从2008年升级到2010年)来破解,就好像断言失败,只要任何浮点数变成NaN,QNAN,INF等?

到目前为止,我刚刚使用了断言(x == x)技巧,但我宁愿隐含一些东西,所以我不必在任何地方添加断言.

相当惊讶我无法通过谷歌找到答案.关于'浮点异常'的一些东西,但我不确定它们是否是同一个东西,我已经尝试在Visual Studio中启用它们,但是程序不会破坏,直到由于NaN后来发生灾难性事件执行中.

c++ floating-point floating-point-exceptions visual-studio-2010 visual-studio

27
推荐指数
1
解决办法
9100
查看次数

在Mac OS X Intel上启用浮点中断

在Linux上,feenableexcept和fedisableexcept可用于控制浮点异常上SIGFPE中断的生成.如何在Mac OS X Intel上执行此操作?

用于启用浮点中断的内联汇编在http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf,第7-15页中提供,但仅适用于PowerPC汇编.

macos intel interrupt floating-point-exceptions

18
推荐指数
2
解决办法
4832
查看次数

什么时候发生下溢?

我遇到计算1.77e-308/10触发下溢异常的情况,但计算1.777e-308/10没有.这很奇怪,因为:

当浮点运算的真实结果的幅度(​​即,接近于零)小于目标数据类型中可表示为正常浮点数的最小值(来自算术下溢,维基百科)时,会发生下溢

换句话说,如果我们计算出x/y其中两个xydouble,那么应该发生溢如果0 < |x/y| < 2.2251e-308(最小正正规化double2.2251e-308).从理论上说,因此,无论是1.77e-308/101.777e-308/10应触发溢异常.该理论与我在下面的C程序中测试的内容相矛盾.

#include <stdio.h>
#include <fenv.h>
#include <math.h>


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 puts("No underflow\n");
}
Run Code Online (Sandbox Code Playgroud)

为了编译程序,我使用了gcc program.c -lm; 我也尝试过Clang,它给了我相同的结果.任何解释?

[编辑]我通过这个在线IDE分享了上面的代码.

c floating-point floating-point-exceptions underflow

15
推荐指数
1
解决办法
2201
查看次数

哪些语言将IEEE 754陷阱暴露给开发人员?

我想把这些陷阱用于教育目的.

数值计算中的默认行为的一个常见问题是我们"错过"出现在错误操作中的Nan(或+ -inf).默认行为是通过计算传播,但是一些操作(如比较)打破了链并松开了Nan,并且其余的处理继续而没有在算法的先前步骤中确认奇点.

有时我们有办法对这种事件做出反应:延长一个功能("0/0 = 12在我的情况下"),或者在时域模拟中抛弃一步并尝试其他设置(如预测器,步骤)大小或其他).

所以这是我的问题:你知道将IEEE754陷阱暴露给开发人员的语言吗?我觉得不喜欢乱用ASM.

floating-point floating-point-exceptions ieee-754

9
推荐指数
1
解决办法
1553
查看次数

强制所有QNaN为正常NaN(SNaN),因此抛出异常

我已经将Visual Studio配置为通过_controlfp函数抛出浮点异常.这适用于NAN和INF,但不适用于QNAN.即安静的NaNs不会引发异常.Visual Studio 2008/2010是否有任何函数或配置选项会强制QNAN为NAN,以便它们抛出异常?

c++ floating-point nan floating-point-exceptions visual-studio

9
推荐指数
1
解决办法
1224
查看次数

发生了无效的浮点运算.SQL Server 2008

我有这个代码的奇怪问题:如果我运行它如下所示我得到错误:

发生了无效的浮点运算.

但是,如果我将参数更改@Longitude为-98.508730 (通知仅更改了最后一位数),代码工作正常.

该代码应该列出@MilesRadius一些LatLng点周围的属性.
@Latitude和@Longitude参数与表Address中的经度和纬度字段的类型相同.

我能在这做什么?谢谢.

DECLARE @Latitude decimal (10,6);
DECLARE @Longitude decimal (10,6);
DECLARE @MilesRadius int;
SET @Latitude = 29.607654
SET @Longitude = -98.508731
SET @MilesRadius  = 5

SELECT     ADR.LineOne as address, 
           ADR.City as city,           
           ADR.Latitude as latitude,
           ADR.Longitude as longitude, 
           ((3959 * acos(cos(radians(@Latitude)) * cos(radians(ADR.Latitude)) * cos(radians(ADR.Longitude) - radians(@Longitude)) + sin(radians(@Latitude)) * sin(radians(ADR.Latitude))))) as distance
FROM       Shared.Address ADR
WHERE      ADR.Latitude IS NOT NULL AND 
           ADR.Longitude IS NOT NULL AND 
           (3959 …
Run Code Online (Sandbox Code Playgroud)

sql floating-point-exceptions sql-server-2008 sql-server-2008-r2

9
推荐指数
1
解决办法
8707
查看次数

C++应用程序中NaN的原因没有引发浮点异常

为了找到在我的C++程序中设置为NaN的浮点变量的原因,我启用了这样的浮点异常:

#include <fenv.h>
feenableexcept(FE_INVALID | FE_OVERFLOW);
Run Code Online (Sandbox Code Playgroud)

我知道它有效,因为当我写:

int val = 0.0/0.0;
Run Code Online (Sandbox Code Playgroud)

在我的程序中,浮点异常上升.但NaNs正在通过我的程序的浮点计算"传播",我不知道哪个变量首先设置为NaN.

存在导致变量设置为NaN的原因是什么,这不会导致浮点异常?

c++ nan floating-point-exceptions

8
推荐指数
2
解决办法
6240
查看次数

掩盖Delphi中的异常

几天来,我一直在用异常面具努力(但徒劳无功).

我开发了一个应用程序,可以对数十万条记录进行大量浮点计算.显然,代码必须能够处理异常,尤其是与浮点计算相关的异常:溢出,ZeroDivide等.

应用程序在具有许多不同类型处理器的Windows 7(32位或64位)下正确运行,如果发生错误,则正确处理条件,引发异常并丢弃记录.

不幸的是,当我启动应用程序时,问题就出现了:在具有Intel Xeon E5-2640 v2 CPU和Windows Server 2003 R2的专用服务器上.这里异常没有提出:有错误的记录不会被与机器描绘这些数值丢弃,所以结果被污染+INF-INF.

问题是在服务器上,错误屏蔽的默认设置与我们在Windows 7中找到的设置不同.特别是,GetExceptionMask默认情况下exZeroDivide调用服务器上的过程我发现,如果GetExceptionMask在Windows 7上调用此异常未被屏蔽.结果就是我说的:在服务器上运行应用程序时,这些异常不会引发,而是由处理器返回极值和"污染"数值来处理.

好吧,不要惊慌,我说,你只是打电话(即在初始化部分)SetExceptionMask排除exZeroDivide,但不起作用.或者更好,虽然刚刚调用SetExceptionMask异常 后exZeroDivide不再屏蔽,但是当执行具有浮点计算的代码时,TArithmeticExceptionMask返回的集GetExceptionMask仍然包含exZeroDivide,因此如果发生错误,则不会引发异常.

有谁能告诉我什么是正确的打电话方式SetExceptionMask

屏蔽默认值可能与计算机和另一台计算机不同的原因是什么?操作系统或处理器类型?

谢谢.

delphi exception-handling floating-point-exceptions

8
推荐指数
1
解决办法
560
查看次数

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

我的任务是表达一些看似奇怪的C代码行为(在x86上运行).我可以很容易地完成其他所有事情,但这个让我很困惑.

代码段1输出 -2147483648

int a = 0x80000000;
int b = a / -1;
printf("%d\n", b);
Run Code Online (Sandbox Code Playgroud)

代码片段2没有输出任何内容,并给出了一个 Floating point exception

int a = 0x80000000;
int b = -1;
int c = a / b;
printf("%d\n", c);
Run Code Online (Sandbox Code Playgroud)

我很清楚Code Snippet 1(1 + ~INT_MIN == INT_MIN)的结果的原因,但是我不太明白整数除以-1如何生成FPE,也不能在我的Android手机(AArch64,GCC 7.2.0)上重现它.代码2只输出与代码1相同,没有任何例外.它是x86处理器的隐藏bug功能吗?

该任务没有告诉任何其他内容(包括CPU架构),但由于整个课程基于桌面Linux发行版,您可以放心地认为它是一个现代的x86.


编辑:我联系了我的朋友,他在Ubuntu 16.04(Intel Kaby Lake,GCC 6.3.0)上测试了代码.结果与所指定的任何内容一致(代码1输出所述内容,代码2与FPE崩溃).

c x86 gcc x86-64 floating-point-exceptions

8
推荐指数
2
解决办法
1188
查看次数

使用uclibc时如何解决对fenv.h中函数的未定义引用?

我试图测试某些功能fenv.h,但是,当我编译如下功能LD失败,undefined reference to 'feclearexcept'undefined reference to 'fetestexcept'。我正在运行针对 uclibc 编译的强化 gentoo,我怀疑这至少在某种程度上是相关的

#include <stdio.h>      /* printf */
#include <math.h>       /* sqrt */
#include <fenv.h>      
#pragma STDC FENV_ACCESS on

int main ()
{
  feclearexcept (FE_ALL_EXCEPT);
  sqrt(-1);
  if (fetestexcept(FE_INVALID)) printf ("sqrt(-1) raises FE_INVALID\n");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

fenv.h/usr/include. 中有静态和动态库 ( libm.a, libm.so) /usr/lib。我正在编译gcc -o test test.c -lm;有没有人知道为什么链接器找不到相关函数。似乎没有fenv.h相应的库。

更新:这篇十年前的博文似乎暗示 uclibc 不支持 fenv。我无法确定是否仍然是这种情况,但如果是这样,有什么可以做的。 http://uclibc.10924.n7.nabble.com/missing-fenv-h-for-qemu-td2703.html

c linux gcc floating-point-exceptions uclibc

7
推荐指数
1
解决办法
3648
查看次数