- 主题:快速开平方算法
double x;//放一个正数
(* (long *)&x)>>=1;
然后进行牛顿迭代。
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
只要把double右移一位就是根近似值,大家可以试试。
【 在 ylh1969 的大作中提到: 】
: double x;//放一个正数
: (* (long *)&x)>>=1;
: 然后进行牛顿迭代。
--
FROM 221.218.61.*
这是受了微信公众号一文的启发,想起40年前干的一件事。
当时是研究了浮点二进制格式。现在觉得有点不靠谱,请你们验证一下。
我手边没有合适的开发环境。
【 在 easior 的大作中提到: 】
: 这种 C/C++ 的数值算法窍门在哪些地方能找到
:
--
FROM 221.218.61.*
0.0好像不行,你们试试。单独处理。
如果指数部分的偏移码算不对,就把指数部分变换成补码,按补码全体右移一位,然后再把指数部分变回偏移码。
算法可以被证明。
参见ieee754格式。
【 在 easior 的大作中提到: 】
: 这种 C/C++ 的数值算法窍门在哪些地方能找到
:
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
如果指数部分是原码补码,算法是对的。可是查了一下,是偏移码,所以还得做些小小的变换。
不知道当年是怎么弄的程序,居然是对的。
整个证明过程,难的是奇数指数尾巴那个1,移到尾数是对的。
1->1
2->1.5
3->1.75
4->2
5->2.25
0.5->0.75
0.25->0.5
0.125->0.375
【 在 vinbo 的大作中提到: 】
: 右移一位难道不是除以2?x/2本来也是一个不错的迭代初值
:
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*