如何计算(1-SQRT(0.5))的任意精度定点表示?
计算(1 - √0.5)的定点格式值并适配无符号整数
常数与需求说明
我有一个常数0.29289321881345247559915563789515...,可通过公式(1 - SQRT(0.5))计算得到,需要将其转换为定点格式,以适配不同大小的无符号整数,示例如下:
| 字长 | Q格式 | 十进制值 | 二进制值 |
|---|---|---|---|
| 8-bit | Q0.3 | 5 | 101 |
| 16-bit | Q0.7 | 75 | 1001011 |
| 32-bit | Q0.15 | 19195 | 100101011111011 |
| 64-bit | Q0.31 | 1257966796 | 1001010111110110000110011001100 |
| 128-bit | Q0.63 | 5402926248376769403 | 100101011111011000011001100110000000110001000011001101101111011 |
问题与核心需求
由于涉及平方根函数,且随着字长增大对数值精度要求越来越高,手动计算这些定点值变得难以实现。我了解到有“抽头算法”可以在有限内存下输出π的数位,希望类似算法也能用于这个常数,但找到的相关论文无法完全理解并转化为代码。
需要解决的问题:
- 如何在类C语言(优先C#)中实现该常数的定点格式计算?
- 针对2的幂次字长,是否存在更高效的计算方法?
额外背景
我有一段C#代码片段:
y -= uint.CreateChecked(value: BinaryIntegerConstants<T>.Size) switch { 8U => (x * ((y * T.CreateChecked(value: 5UL)) >> 4)), 16U => (x * ((y * T.CreateChecked(value: 75UL)) >> 8)), 32U => (x * ((y * T.CreateChecked(value: 19195UL)) >> 16)), 64U => (x * ((y * T.CreateChecked(value: 1257966796UL)) >> 32)), 128U => (x * ((y * T.CreateChecked(value: 5402926248376769403UL)) >> 64)), _ => throw new NotSupportedException(), // TODO: Research a way to calculate the proper constant at runtime. }
目前已通过手动计算得到上述代码中的常数,但受double类型精度限制,无法扩展到更大的字长。
内容的提问来源于stack exchange,提问作者Kittoes0124
相关产品推荐
相关产品推荐

