理性到浮点

时间:2015-10-05 18:26:12

标签: java c++ c floating-point

考虑下面结构所代表的有理数。

struct rational {
    uint64_t n;
    uint64_t d;
    unsigned char sign : 1;
};

假设IEEE {754二进制64表示double,如何通过正确的舍入将结构转换为最近的double?将nd转换为double并将它们分开的天真方法会使舍入错误更加复杂。

1 个答案:

答案 0 :(得分:2)

实现所需结果的一种方法是在整数空间中执行除法。由于标准C / C ++不提供128位整数类型(虽然某些工具链可能将此作为扩展),但这不是很有效,但它会产生正确的结果。

下面的代码生成54个商位和一个余数,每次一位。最重要的53个商位代表AuthStatus.SUCCESS结果的尾数部分,而最低有效商位和剩余部分用于舍入到最近或甚至"根据IEEE-754。

下面的代码可以编译为C或C ++程序(至少它与我的工具链一起编译)。它经过了轻微的测试。由于逐位处理,这不是非常快,并且可以进行各种优化,尤其是在使用机器特定的数据类型和内在函数的情况下。

null