前段时间我写了一个程序,它使用了一些阶乘函数。我使用 long double 数据类型来支持“相对”大数字。
现在,我从代码块更改为 Visualstudio 2010,我想知道为什么我的程序不再工作,直到经过一些研究后我意识到 MS 已经放弃了 long double 数据类型。这有什么特别的原因吗?对我来说,这看起来像是技术方面的倒退。
有什么替代品可以使用吗?(我也会对 boost 库中的替代方案感到满意)。
前段时间我写了一个程序,它使用了一些阶乘函数。我使用 long double 数据类型来支持“相对”大数字。
现在,我从代码块更改为 Visualstudio 2010,我想知道为什么我的程序不再工作,直到经过一些研究后我意识到 MS 已经放弃了 long double 数据类型。这有什么特别的原因吗?对我来说,这看起来像是技术方面的倒退。
有什么替代品可以使用吗?(我也会对 boost 库中的替代方案感到满意)。
我不确定你为什么认为它long double
被“放弃”了,因为它是 C++ 标准的一部分,因此一个兼容的实现必须很好地实现它。
他们“放弃”的是数学函数的重载long double
,他们这样做是因为:
但是,在 Win32 编程中,
long double
数据类型映射到double
64 位精度数据类型。
反过来,long double
在旧的 VS 版本中是 80 位的,这是因为:
FP 代码生成已经切换到使用 SSE/SSE2/SSE3 指令集,而不是 x87 FP 堆栈,因为这是 AMD 和 Intel 近期和未来芯片世代都在关注的性能工作。这些指令集仅支持 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
- 一些 C++ 工具链作为扩展支持的 C99 功能;stdint.h
- Boost 作为库重新实现的 C99 功能;cstdint
- 如果您正在编写 C++0x 代码,可能会用到一个 C++0x 功能。