【发布时间】:2017-12-04 17:39:10
【问题描述】:
我想计算uint64_t 的整数部分。对于 32 位的uint32_t,经常建议先转换为double、sqrt,然后再转换回uint32_t。
它是否也适用于uint64_t,因为double 只能容纳最多 2^53 的数字?即,以下总是会给出正确的答案:
#include <math.h>
uint64_t x = ...;
uint64_t result = (uint64_t)sqrt((double)x);
甚至:
#include <math.h>
uint64_t x = ...;
uint32_t result = (uint32_t)sqrt((double)x);
【问题讨论】:
-
即使对于
uint32_t,这只有在您知道您的数学库的sqrt很好并且您的C 实现对浮点运算很好时才可靠。单独的 C 标准不需要这个。即使对于具有可表示的精确平方根的值,一些数学库也仅返回近似结果。 -
我写了 an answer 推荐 32 位整数的双重策略,但它是为了回应一个 Java 问题。答案取决于特定于 Java 的保证,不适用于 C。
标签: floating-point square-root