是否存在类型为double
(IEEE 64位浮点/二进制64)K
的值,例如K * K == 3.0
?(无理数当然是"3的平方根")
我试过:
static constexpr double Sqrt3 = 1.732050807568877293527446341505872366942805253810380628055806;
static_assert(Sqrt3 * Sqrt3 == 3.0);
但静态断言失败.
(我猜在四舍五入后,下一个高或下一个低的浮点可表示数字平方都不会变为3.0
?或者浮点文本的解析器很愚蠢?或者在IEEE标准中是可行的,但快速的数学优化会把它搞糟?)
我认为数字是对的:
$ python
>>> N = 1732050807568877293527446341505872366942805253810380628055806
>>> N * N
2999999999999999999999999999999999999999999999999999999999996\
607078976886330406910974461358291614910225958586655450309636
Update
我发现:
static_assert(Sqrt3 * Sqrt3 < 3.0); // pass
static_assert(Sqrt3 * Sqrt3 > 2.999999999999999); // pass
static_assert(Sqrt3 * Sqrt3 > 2.9999999999999999); // fail
因此,文本必须生成下一个较低的值.
我想我需要判断下一个更高的值.可以位转储表示,然后增加尾数的最后一位.
Update 2
对于子孙后代:我最后将此用于Sqrt3常量和测试:
static constexpr double Sqrt3 = 1.7320508075688772;
static_assert(0x1.BB67AE8584CAAP+0 == 1.7320508075688772);
static_assert(Sqrt3 * Sqrt3 == 2.9999999999999996);