如何将double转换为';长双人床';作为标准 如何将代码> double b/COD>转换为 long double /COD>作为C++标准。我觉得像这样投不是正确的方式 double value = 1.2; long double newValue = (long double)value;

如何将double转换为';长双人床';作为标准 如何将代码> double b/COD>转换为 long double /COD>作为C++标准。我觉得像这样投不是正确的方式 double value = 1.2; long double newValue = (long double)value;,c++,C++,这很好,但它不会神奇地在newValue中创建额外的精度。也就是说,它不会产生与以下相同的结果: long double newValue = 1.2L; 将newValue设置为更接近1.2的近似值。采用静态转换: long double newValue = static_cast<long double>(value); long double newValue=static_cast(值); 或使用C++11样式: auto newValue = static_cast

这很好,但它不会神奇地在
newValue
中创建额外的精度。也就是说,它不会产生与以下相同的结果:

long double newValue = 1.2L;
newValue
设置为更接近1.2的近似值。

采用静态转换:

long double newValue = static_cast<long double>(value);
long double newValue=static_cast(值);
或使用C++11样式:

auto newValue = static_cast<long double>(value);
autonewvalue=static\u cast(值);

(被称为“显式类型初始化器惯用法”)。

标准保证
长双精度
可以支持
双精度
可以支持的所有值(或者,换句话说,a
双精度
可以支持的值集是
长双精度
可以表示的值的子集)

那么,任务呢

long double newValue = value;
这就足够了,尽管需要将
双精度
隐式转换为
长双精度
,而不是显式转换。这是一种不会失去精度的转换

C++中的显式替代方案是

long double newValue = (long double)value;    // as in original question
long double newvalue = static_cast<long double>(value);
long double newValue=(long double)value;//如原问题所述
长双新值=静态_转换(值);
这实际上是一个主观风格的问题,哪种选择被认为是更好的,因为它们都达到了相同的效果,而没有潜在的精度损失


请注意,如果使用另一种方法(从
long double
转换为
double
),通常最好使用显式转换,因为转换可能会丢失精度(因此会更改值)-这就是为什么编译器经常(可以配置为)对此类隐式转换发出警告。

这将给您一个包含指定值的长双精度(但请注意,编译器可以将
double
longdouble
实现为相同的类型,有些编译器会这样做)。离题,但是否有处理器本机支持长双精度?@thang:是的--x86支持(举个例子)。它在硬件上支持32位(浮点)、64位(双精度)和80位(长双精度)类型。@JerryCoffin,你说得对。我完全错过了。不过,似乎英特尔想摆脱它:。@thang:或多或少,是的。他们当然想摆脱x87(基于堆栈的处理器,所以使用所有寄存器都很困难)在SSE指令集中没有包含80位类型。你认为<>代码>类型< /C> > VS >代码>静态转换< /代码>(你的答案vs. EvGyij-Malaskin回答)。哪一个是C++方式?@ NayaAdAdSuriSyia:双到长双铸造是一个精确的加宽铸件。(因为每个
double
值都可以表示为
long double
)。因此,几乎不需要强制转换,我对“C++方式”的解释是,在这种情况下首选隐式强制转换。如果需要显式强制转换,我通常会使用构造函数语法(
double(foo+3)
),但如果
long double
不可能,除非
long double
被括起来,在这种情况下,它会变成一个C风格的cast
(long double)(foo+3)
,这就是我编写它的方式(但只有在确实需要的情况下)