考虑下面结构所代表的有理数。
struct rational {
uint64_t n;
uint64_t d;
unsigned char sign : 1;
};
假设IEEE {754二进制64表示double
,如何通过正确的舍入将结构转换为最近的double
?将n
和d
转换为double
并将它们分开的天真方法会使舍入错误更加复杂。
答案 0 :(得分:2)
实现所需结果的一种方法是在整数空间中执行除法。由于标准C / C ++不提供128位整数类型(虽然某些工具链可能将此作为扩展),但这不是很有效,但它会产生正确的结果。
下面的代码生成54个商位和一个余数,每次一位。最重要的53个商位代表AuthStatus.SUCCESS
结果的尾数部分,而最低有效商位和剩余部分用于舍入到最近或甚至"根据IEEE-754。
下面的代码可以编译为C或C ++程序(至少它与我的工具链一起编译)。它经过了轻微的测试。由于逐位处理,这不是非常快,并且可以进行各种优化,尤其是在使用机器特定的数据类型和内在函数的情况下。
null