【问题标题】:Why TRACE() throws Floating-point underflow exception?为什么 TRACE() 会抛出浮点下溢异常?
【发布时间】:2018-02-09 12:21:35
【问题描述】:

为什么在 TRACE 中会出现浮点下溢(参数:0x00000000)? 我在这里需要什么格式说明符?

// show load progress by callback-Funktion (on Statusbar)
ULONGLONG len =  1000;   // ar.GetFile()->GetLength();
ULONGLONG pos =  800;    // ar.GetFile()->GetPosition();
double perc = (double)pos/(double)len*100; 

TRACE("load from %X, Position: %ld, Length: %ld, Perc: %lf \n", 
    this, pos, len, perc ); 

更新

lenpos 不在乎,TRACE调试模式 中总是抛出错误。 使用使用多字节字符集编译。将代码从 VS9 升级到 VS14。在 Release-Mode 下似乎一切正常。

调试输出是:

Natvis: Parsing natvis xml file: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers\windows.media.natvis.
Natvis: Parsing natvis xml file: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers\windows.natvis.
Natvis: Parsing natvis xml file: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers\winrt.natvis.
Natvis: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers\atlmfc.natvis(9,28): Successfully parsed expression 'm_hWnd' in type context 'CWnd'.
Exception thrown at 0x5B4EE469 (ucrtbased.dll) in TestProgD.exe: 0xC0000093: Floating-point underflow (parameters: 0x00000000).
Unhandled exception at 0x5B4EE469 (ucrtbased.dll) TestProgD.exe: 0xC0000093: Floating-point underflow (parameters: 0x00000000).

【问题讨论】:

  • 请显示你得到的逐字输出,同时显示lenpos的实际值。
  • 您是否尝试过通过代码分析来构建它,看看它会引起您的注意什么?

标签: c++ visual-studio visual-studio-2015 mfc


【解决方案1】:

格式说明符与参数类型不匹配,因此您的行为未定义。

  • %X (unsigned int) 应该是 %p(指针)。
  • %ld (long int) 应该是 %llu (unsigned long long)。在 Windows 平台上,long intint 相同,因此始终为 32 位,无论代码是为 32 位还是 64 位构建的。只有 long long 始终是 64 位的。当然,您还想匹配签名,这就是必须使用 u 说明符的原因。

Reference.

【讨论】:

  • 酷。我认为代码分析会解决这些问题。它对我有用。
  • @AndrewTruckle 当我用printf 替换TRACE 时,我确实收到了预期的警告。我还收到CString::Format() 的警告。
  • @AndrewTruckle Follow-up question.
  • 我不确定为什么代码会产生浮点错误。最后的说明符 (%lf) 应与 long double 一起使用。虽然long double 与带有Microsoft 编译器的double 具有相同的内存布局,但这并不重要。虽然正确的说明符是%f
  • 谢谢。是的,这个更正的格式参数已经解决了这个问题。我的检查,为什么我得到浮点错误,是因为一个库用 _controlfp(~(EM_OVERFLOW | EM_UNDERFLOW | EM_DENORMAL), MCW_EM); 设置浮点控制字;注意:0 = 设置异常,1 = 清除异常。
猜你喜欢
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多