You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在IEEE 64位double类型值K满足K*K == 3.0?

结论

不存在符合IEEE 754 binary64标准的double类型值K,能够满足K * K == 3.0。

核心原因
  • 所有double类型的可表示值本质都是有理数:binary64格式采用1位符号位、11位指数位、52位尾数位存储,加上隐含的整数前导1,共53位二进制有效精度,所有可表示值都可以写成m * 2^e(m、e均为整数)的形式,必然是有理数。
  • 3的平方根是无理数,不存在任何有理数的平方精确等于3:假设存在既约分数p/q满足(p/q)²=3,可推导出p、q均为3的倍数,和既约分数的定义矛盾,因此没有任何有理数的平方能精确等于3。
  • 即便考虑浮点乘法默认的“舍入到最近值、中间值取偶数位”规则,√3两侧最近的两个可表示double值的平方,也不会舍入为3.0:
    • 小于真实√3的最近double值就是代码中使用的1.7320508075688772(十六进制浮点表示为0x1.BB67AE8584CAAP+0),它的平方计算结果为2.9999999999999996,比3.0小整整1个ulp(最小精度单位,对3.0来说ulp值约为4.44e-16),达不到舍入到3.0的0.5ulp阈值。
    • 大于真实√3的最近double值是上述值尾数加1得到的0x1.BB67AE8584CABp+0,即十进制的1.7320508075688774,它的平方计算结果为3.0000000000000004,比3.0大1个ulp,同样不会舍入到3.0。
相关猜测验证
  • 不是浮点数字面量解析器异常:输入的长串√3十进制近似值,解析到最近的可表示double值就是1.7320508075688772,解析逻辑完全符合标准。
  • 不是快速数学优化干扰:哪怕关闭所有激进浮点优化、严格遵循IEEE 754运算规范,也不存在能让等式成立的K值,优化无法凭空创造出格式本身无法表示的值。
  • 测试结果完全准确:当前定义的Sqrt3确实是小于真实√3的相邻浮点值,它的平方落在(2.999999999999999, 2.9999999999999999)区间内,和断言结果一致。
可用的常量定义方案

最终采用的定义方式非常严谨,通过十六进制浮点字面量做校验,可以避免不同编译器对长十进制字面量解析的微小差异,可直接使用:

static constexpr double Sqrt3 = 1.7320508075688772;
static_assert(0x1.BB67AE8584CAAP+0 == 1.7320508075688772);
static_assert(Sqrt3 * Sqrt3 == 2.9999999999999996);

内容的提问来源于stack exchange,提问作者Andrew Tomazos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 10:30:52