|
|
1
3
首先要做的是分解:
我们不仅避免了一些溢出,而且获得了准确性。
如果任何因素接近
这种情况不太可能发生,所以
请注意,如果
|
|
|
2
2
这个答案假设一个平台使用符合IEEE-754(2008)的浮点算法,并提供融合乘加(FMA)功能。x86-64、ARM64和Power等常见体系结构都满足这两个条件。FMA在ISO C99和更高版本的C标准中作为标准数学函数公开
从数学上讲,给定斜边和另一条腿的长度,直角三角形中一条腿(cathetus)的长度可以简单地计算为
第一个问题可以通过按2的比例轻松解决 n 这样,量值较大的一词就更接近于统一。由于可能涉及次正常数,这无法通过操纵指数字段来实现,因为可能需要规范化/非规范化。但我们可以通过指数字段位操作,即乘以因子来计算所需的比例因子。我们知道,对于非特殊情况,斜边必须更长或与给定腿的长度相同,因此可以根据该参数进行缩放。
处理减法对消比较困难,但幸运的是,在其他重要问题中,计算与我们的计算h-a非常相似。例如,浮点计算大师研究了二次公式判别式的精确计算,
William Kahan,“关于无超精密算法的浮点计算成本”,2004年11月21日( online )
最近,法国研究人员研究了两种产品差异的更一般情况,
Claude Pierre Jeannerod、Nicolas Louvet、Jean-Michel Muller,“进一步分析Kahan算法,以精确计算2 x 2行列式。” 计算数学 ,第82卷,第2842013年10月,第2245-2264页( online ) 第二篇文章中基于FMA的算法计算两个乘积的差值,经证明最大误差为1.5 ulp 。有了这个构建块,我们就可以得到下面cathetus计算的简单ISO C99实现。通过与任意精度库的结果进行比较,在10亿个随机试验中观察到最大误差为1.2 ulp:
|
|
|
3
1
假设IEEE 754基本64位二进制浮点,我会考虑如下算法:
关于推理的注释:
|
|
4
0
放在一边,我倾向于只写
作为函数的主体,并让调用者检查输入。如果无法做到这一点,请遵循
|
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |