为什么微软放弃了长双数据类型?

时间:2011-08-19 11:10:42

标签: c++ visual-studio floating-point long-double

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

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

有没有其他选择? (我也会对升级库中的替代品感到满意。)

1 个答案:

答案 0 :(得分:13)

我不确定为什么你认为long double被“放弃”,因为它是C ++标准的一部分,因此合规的实现必须实现它。

What they did "abandon" is long double overloads of mathematical functions,他们这样做是因为:

  

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

反过来,与旧版VS版本中的long double为80位,is because

  

FP代码生成已经转向使用SSE / SSE2 / SSE3指令集而不是x87 FP堆栈,因为这是AMD和英特尔最近和未来的芯片代表都在关注其性能工作。这些指令集仅支持32位和64位FP格式。

尽管如此,他们选择不支持这些重载,即使使用相同大小的doublelong double类型(两者都可能是64位),也是一种耻辱,因为它们是也是 C ++标准的一部分。但是,那就是微软为你而存在的。专心固执。

  

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

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

  

Microsoft运行时库提供了long double版本的   数学函数仅用于向后兼容。


  

有没有其他选择? (我也会对升级库中的替代品感到满意。)

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

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

  • stdint.h - 一些C ++工具链作为扩展支持的功能;
  • stdint.h - Boost重新实现为库的C99功能;
  • cstdint - 如果您正在编写C ++ 0x代码,则可能会使用C ++ 0x功能。