Skip to content

Commit 6515041

Browse files
stdlib: Implement correctly rounded sqrt (4/4/4)
Robust: 4/4 (Does it work for all input values?) Accurate: 4/4 (How accurate is the result?) Well behaved: 4/4 (Does it preserve math properties?) 算經.平方根 should return exactly the same result as Math.sqrt for all input numbers except -0, for which Math.sqrt(-0) = -0 complying to IEEE 754, but 算經.平方根(-0) = +0. This will also make the current implementation of hypot a tiny bit more accurate than before. I'll rate hypot 4/2/3 after this patch (previously 4/2/2) due to the following property being preserved when sqrt is correctly rounded: hypot(x, y) >= |x| && hypot(x, y) >= |y|
1 parent dce4a15 commit 6515041

File tree

1 file changed

+42
-7
lines changed

1 file changed

+42
-7
lines changed

lib/算經.wy

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -748,16 +748,31 @@
748748
有數四分一釐七毫三絲一忽九微。名之曰「平方根常數甲」。
749749
注曰「「 (2^0.5 - 1) * sqrt((2^0.25 + 2^-0.25) / 2) 」」
750750
減一於「二之平方根」。乘其以二。名之曰「平方根常數乙」。
751+
乘「上位冪」於「微位冪」。乘其以「進制」。乘其以「進制」。名之曰「平方根下溢界」。
751752

752753
今有一術。名之曰「平方根」。欲行是術。必先得一數曰「甲」。乃行是術曰。
753-
若「甲」大於零者。若非。
754-
注曰「「浮點數相較。所得有四。曰小於。曰等於。曰大於。曰無序。故非大於者與不大於者異也。」」
755-
若「甲」等於零者。乃得「浮點零」也。
756-
若「甲」小於零者。施「不可算」。乃得矣。云云。
757-
乃得「甲」。
754+
有爻陽。名之曰「非常」。
755+
若「甲」不小於「平方根下溢界」者。若「甲」小於「巨位冪」者。
756+
昔之「非常」者。今陰是矣。
757+
云云。云云。
758+
若「非常」者。
759+
若「甲」等於零者。
760+
乃得「浮點零」也。
761+
施「不可算數乎」於「甲」。若其者。
762+
乃得「甲」也。
763+
若「甲」大於「至巨數」者。
764+
乃得「甲」也。
765+
若「甲」小於零者。
766+
施「不可算」。乃得矣。云云。
767+
若「甲」不大於「平方根下溢界」者。
768+
乘「甲」以「上位冪」。乘其以「上位冪」。乘其以「進制」。乘其以「進制」。取一以施「平方根」。
769+
乘其以「下位冪」。乘其以「退制」。乃得矣。
770+
云云。
771+
若「甲」不小於「巨位冪」者。
772+
乘「甲」以「退制」。乘其以「退制」。取一以施「平方根」。
773+
乘其以「進制」。乃得矣。
774+
云云。
758775
云云。
759-
若「甲」大於「至巨數」者。
760-
乃得「甲」也。
761776

762777
施「析浮點數」於「甲」。名之曰「析甲」。
763778
夫「析甲」之「「位」」。除其以二。名之曰「半位」。
@@ -772,6 +787,26 @@
772787
除「甲」以「乙」。加其以「乙」。除其以二。名之曰「丙」。
773788
昔之「乙」者。今「丙」是矣。
774789
云云。
790+
791+
注曰「「以下校末位。」」
792+
施「取內鄰數」於「乙」。名之曰「下數」。
793+
施「相乘得雙」於「乙」。於「下數」。名之曰「下積」。
794+
夫「下積」之一。若其大於「甲」者。
795+
乃得「下數」也。
796+
夫「下積」之一。若其等於「甲」者。夫「下積」之二。若其不小於零者。
797+
乃得「下數」也。
798+
云云。
799+
注曰「「若甲等於中數乘下數者。其平方根不足下半間數。捨餘得下數也。」」
800+
801+
施「取外鄰數」於「乙」。名之曰「上數」。
802+
施「相乘得雙」於「乙」。於「上數」。名之曰「上積」。
803+
夫「上積」之一。若其小於「甲」者。
804+
乃得「上數」也。
805+
夫「上積」之一。若其等於「甲」者。夫「上積」之二。若其小於零者。
806+
乃得「上數」也。
807+
云云。
808+
注曰「「若甲等於中數乘上數者。其平方根不足上半間數。捨餘得中數也。」」
809+
775810
乃得「乙」。
776811
是謂「平方根」之術也。
777812

0 commit comments

Comments
 (0)