假设我们正在开发一个类型long double
的精度高于64位的平台。将给定long double
转换为普通双精度数的最快方法是什么,具有一些规定的舍入(向上,向下,舍入到最近等)?
为了使问题更加准确,让我举一个具体的例子:让N
成为给定的long double
,将M
作为double
,其值最小化({1}}真实)值M - N
,以便M
> N
。这个M
将是我想要找到的向上舍入的转换。
我是否可以适当地设置FP环境的舍入模式并执行简单的转换(例如(double) N
)?
澄清:您可以假设该平台支持IEEE浮点运算标准(IEEE 754)。
答案 0 :(得分:3)
我可以适当地设置FP环境的舍入模式并执行简单的转换(例如(双倍)N)吗?
是的,只要编译器实现了IEEE 754(大多数都至少粗略地执行)。从一种浮点格式到另一种浮点格式的转换是根据IEEE 754应用舍入模式的操作之一。要从long double
转换为double
,请将舍入模式设置为向上并进行转换。
在C99中,C ++编译器应该接受它(我不确定是否为C ++指定了语法):
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
…
fesetround(FE_UPWARD);
double d = (double) ld;
PS:您可能会发现您的编译器没有正确实现#pragma STDC FENV_ACCESS ON
。欢迎来到club。