inf*_*inf 21 c++ floating-point long-double visual-studio
不久前我写了一个程序,它使用了一些阶乘函数.我使用long double数据类型来支持"相对"大数字.
现在,我从代码块改为Visualstudio 2010,我想知道为什么我的程序不再工作,直到我在一些研究中意识到MS已经放弃了长双数据类型.这有什么特别的原因吗?对我而言,它看起来非常像技术方面的倒退.
有没有其他选择?(我也很乐意使用boost库中的替代品).
Lig*_*ica 14
我不确定为什么你认为它long double
被"放弃",因为它是C++标准的一部分,因此一个兼容的实现必须实现它.
他们所做的 "放弃"是long double
数学函数的重载,他们这样做是因为:
但是,在Win32编程中,
long double
数据类型映射到double
64位精度数据类型.
反过来,随着long double
旧版VS版本的80位,这是因为:
FP代码生成已经转向使用SSE/SSE2/SSE3指令集而不是x87 FP堆栈,因为这是AMD和英特尔近期和未来的芯片代表都在关注其性能工作.这些指令集仅支持32和64位FP格式.
尽管如此,他们选择不支持这些重载,即使是相同大小double
和long double
类型(两者都可能是64位),也是一种耻辱,因为它们也是 C++标准的一部分.但是,那就是微软为你而存在的.专心固执.
[n3290: 26.8]:
除了double
数学函数的版本之外<cmath>
,C++还添加float
和long double
重载了这些函数的版本,具有相同的语义.
然而,尽管这些重载在Visual Studio中基本上是过时了,他们都仍然可用,所以你应该仍然能够使用它们:
Microsoft运行时库仅提供
long double
数学函数的版本以实现向后兼容.
有没有其他选择?(我也很乐意使用boost库中的替代品).
听起来像你一直依赖于long double
支持特定范围的数值,并且当在不同的工具链中发生变化时,它会遇到回归问题.
如果您有特定的数值范围要求,请使用固定范围积分类型.在这里你有几个选择:
stdint.h
- 一些C99工具链作为扩展支持的C99功能;stdint.h
- Boost重新实现为库的C99功能;cstdint
- 如果您正在编写C++ 0x代码,则可能会使用C++ 0x功能.