如何将 double 转换为标准的 long double?

5
如何将double转换为long double,符合C++标准。我认为仅仅进行强制类型转换并不是正确的方法?
double value = 1.2;
long double newValue = (long double)value;

1
这将给你一个包含指定值的长双精度浮点数(但要注意编译器允许将doublelong double实现为相同类型,有些编译器确实如此)。 - Jerry Coffin
1
题外话,但是有没有支持长双精度的处理器? - thang
1
@thang:是的——x86架构支持32位(float)、64位(double)和80位(long double)类型的硬件。 - Jerry Coffin
1
@JerryCoffin,你说得对。我完全没注意到。不过英特尔似乎想要摆脱它:https://dev59.com/NXA75IYBdhLWcg3wm6Uj。 - thang
1
@thang:差不多吧。他们肯定想要摆脱x87(基于堆栈的处理器,因此使用所有寄存器很困难),并且没有在SSE指令集中包括80位类型。 - Jerry Coffin
“将其转换为C++标准”是什么意思? - juanchopanza
3个回答

6

这样做是可行的,但它不会在newValue中魔法般地创造出额外的精度。也就是说,它不会产生与以下代码相同的结果:

long double newValue = 1.2L;

这将把newValue设置为更接近1.2的近似值。


你认为类型转换和静态转换怎么样?(你的回答与Evgenij Malashkin的回答相比)。哪一个是C++的方式? - Nayana Adassuriya
@NayanaAdassuriya:将double转换为long double是一种精确的扩展转换(因为每个“double”值都可以表示为“long double”)。因此,几乎不需要进行强制转换,我的“C ++方式”的解释是在这种情况下首选隐式转换。如果需要显式转换,我通常会使用构造函数语法(double(foo+3)),但是对于long double来说这是不可能的,除非将其括在括号中,这样它就变成了C风格的转换(long double)(foo+3),如果真的有必要,我会这样写。 - rici

4
标准保证 long double 可以支持 double 所有的值(或者说,double 可以支持的值是 long double 的子集)。
所以,这个赋值语句:
long double newValue = value;

虽然会涉及将valuedouble隐式转换为long double,但这已足够。这是一种不会丢失精度的转换。

C++中的显式替代方法有:

long double newValue = (long double)value;    // as in original question
long double newvalue = static_cast<long double>(value);

哪种选择更好其实是主观风格的问题,因为它们都能在不损失精度的情况下达到相同的效果。

请注意,如果反过来转换(从long double转换为double),通常最好使用显式转换,因为转换可能会失去精度(并且因此可以改变值)-这就是为什么编译器经常(可以配置为)在这种隐式转换上发出警告的原因。


2

使用static_cast:

long double newValue = static_cast<long double>(value);

或者采用 C++11 风格的写法:

auto newValue = static_cast<long double>(value);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接