Dekker浮点数的std::numeric_limits::epsilon()定义及返回值问询
关于Double-Double和Quad-Double算术库的numeric_limits实现问题
问题1:Float64x2/Float64x4的epsilon()实现方案选择
首先明确std::numeric_limits<T>::epsilon()的标准定义:它是1.0到下一个可表示的T类型值的最小差值,本质是衡量T类型在1.0附近的精度,和类型的最小正数值(min/denorm_min)完全不是一个概念,所以直接排除第一种方案。
剩下两种方案的选择取决于你的库的设计目标:
- 若兼容QD库行为:选择QD的定义(Float64x2用
0x1.0p-104,Float64x4用0x1.0p-208)。QD库中dd_real/qd_real的epsilon对应其实现的有效位数(104/208位二进制),这是因为其内部表示对低位的有效位数做了取舍,优先保证计算性能和兼容性。 - 若追求Dekker扩展精度的理论上限:选择DDFUN的定义(
ldexp(1.0, -numeric_limits<T>::digits),对应0x1.0p-106和0x1.0p-212)。Dekker原始的double-double设计中,两个double的53位有效位可组合出106位的有效精度,此时epsilon应对应106位精度下的最小增量,DDFUN的定义完全匹配这一理论精度。
问题2:Float64x4的epsilon()返回类型
根据C++标准库的约定,std::numeric_limits<T>::epsilon()的返回类型必须是T。比如std::numeric_limits<double>::epsilon()返回double,std::numeric_limits<float>::epsilon()返回float,自定义浮点类型也需要遵循这一接口一致性。
若返回double类型,会破坏numeric_limits的类型安全和接口统一性,导致用户在泛型代码中使用时出现类型不匹配的问题。因此,std::numeric_limits<Float64x4>::epsilon()必须返回Float64x4类型。
内容的提问来源于stack exchange,提问作者Vortex 2728182818
相关产品推荐
相关产品推荐

