25

前段时间我写了一个程序,它使用了一些阶乘函数。我使用 long double 数据类型来支持“相对”大数字。

现在,我从代码块更改为 Visualstudio 2010,我想知道为什么我的程序不再工作,直到经过一些研究后我意识到 MS 已经放弃了 long double 数据类型。这有什么特别的原因吗?对我来说,这看起来像是技术方面的倒退。

有什么替代品可以使用吗?(我也会对 boost 库中的替代方案感到满意)。

4

1 回答 1

19

我不确定你为什么认为它long double被“放弃”了,因为它是 C++ 标准的一部分,因此一个兼容的实现必须很好地实现它。

他们“放弃”的是数学函数的重载long double,他们这样做是因为

但是,在 Win32 编程中,long double数据类型映射到double64 位精度数据类型。

反过来,long double在旧的 VS 版本中是 80 位的,这是因为

FP 代码生成已经切换到使用 SSE/SSE2/SSE3 指令集,而不是 x87 FP 堆栈,因为这是 AMD 和 Intel 近期和未来芯片世代都在关注的性能工作。这些指令集仅支持 32 位和 64 位 FP 格式。

尽管如此,他们选择不支持这些重载,即使具有相同的大小doublelong double类型(两者都可以制作为 64 位),这是一种耻辱,因为它们也是C++ 标准的一部分。但是,好吧,这就是你的微软。执拗固执。

[n3290: 26.8]:除了double中的数学函数版本之外<cmath>,C++ 还添加floatlong double重载了这些函数的版本,具有相同的语义。

但是,尽管这些重载在 Visual Studio 中基本上已弃用,但它们仍然可用,因此您应该仍然可以使用它们:

Microsoft 运行时库提供long double数学函数的版本只是为了向后兼容。


有什么替代品可以使用吗?(我也会对 boost 库中的替代方案感到满意)。

在我看来,您一直依赖于long double支持特定范围的数值,因此当在不同的工具链中发生变化时会遇到回归问题。

如果您有特定的数值范围要求,请使用固定范围整数类型。在这里,您有几个选择:

  • stdint.h- 一些 C++ 工具链作为扩展支持的 C99 功能;
  • stdint.h- Boost 作为库重新实现的 C99 功能;
  • cstdint- 如果您正在编写 C++0x 代码,可能会用到一个 C++0x 功能。
于 2011-08-19T11:13:09.327 回答