【问题标题】:Converting a long double to double with upward (or downward) rounding向上(或向下)舍入将 long double 转换为 double
【发布时间】:2015-01-22 22:37:59
【问题描述】:

假设我们正在一个平台上工作,其中long double 类型的精度严格高于 64 位。将给定的long double 转换为具有某些规定舍入(向上、向下、舍入到最近等)的普通双精度数的最快方法是什么?

为了使问题更准确,让我举一个具体的例子:让N 是给定的long double,而Mdouble,其值最小化了(实际)值M - N,这样M > N。这个M 将是我想要找到的向上舍入转换。

我可以适当地设置 FP 环境的舍入模式并执行简单的强制转换(例如(double) N)吗?

澄清:您可以假设该平台支持 IEEE 浮点算术标准 (IEEE 754)。

【问题讨论】:

  • 当然 FP 硬件会比任何位操作都快。您在寻找软件解决方案吗?
  • 顺便说一句,你不是说(double) N)吗?
  • 您的问题是特定于平台的,但您提出的解决方案正是我将如何完成这项任务。
  • @chux :这正是我的意思,感谢您的更正。
  • @tmyklebu :你是对的,你可以假设底层平台支持 IEEE 754 标准。我也在问题正文中添加了此说明。

标签: c++ c floating-point floating-accuracy floating-point-precision


【解决方案1】:

我可以适当地设置 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

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2015-08-23
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多