[libc-commits] [libc] [libc][math] Implement a fast pass for atan2f128 with 1ULP error using DyadicFloat<128>. (PR #133150)
via libc-commits
libc-commits at lists.llvm.org
Mon Mar 31 07:27:18 PDT 2025
================
@@ -130,6 +134,106 @@ DoubleDouble atan_eval(const DoubleDouble &x) {
return p;
}
+// Float128 versions.
+// atan(i/64) with i = 0..64, generated by Sollya with:
+// > for i from 1 to 64 do {
+// a = round(atan(i/64), 128, RN);
+// ll = ceil(log2(a));
+// b = 2^ll + a;
+// print("{Sign::POS, ", 2^(ll - 128), ",", b, "},");
+// };
+constexpr Float128 ATAN_I_F128[65] = {
+ {Sign::POS, 0, 0_u128},
+ {Sign::POS, -134, 0xfffaaadd'db94d5bb'e78c5640'15f76048_u128},
+ {Sign::POS, -133, 0xffeaaddd'4bb12542'779d776d'da8c6214_u128},
+ {Sign::POS, -132, 0xbfdc0c21'86d14fcf'220e10d6'1df56ec7_u128},
+ {Sign::POS, -132, 0xffaaddb9'67ef4e36'cb2792dc'0e2e0d51_u128},
+ {Sign::POS, -131, 0x9facf873'e2aceb58'99c50bbf'08e6cdf6_u128},
+ {Sign::POS, -131, 0xbf70c130'17887460'93567e78'4cf83676_u128},
+ {Sign::POS, -131, 0xdf1cf5f3'783e1bef'71e5340b'30e5d9ef_u128},
+ {Sign::POS, -131, 0xfeadd4d5'617b6e32'c897989f'3e888ef8_u128},
+ {Sign::POS, -130, 0x8f0fd7d8'21b93725'bd375929'83a0af9a_u128},
+ {Sign::POS, -130, 0x9eb77746'331362c3'47619d25'0360fe85_u128},
+ {Sign::POS, -130, 0xae4c08f1'f6134efa'b54d3fef'0c2de994_u128},
+ {Sign::POS, -130, 0xbdcbda5e'72d81134'7b0b4f88'1c9c7488_u128},
+ {Sign::POS, -130, 0xcd35474b'643130e7'b00f3da1'a46eeb3b_u128},
+ {Sign::POS, -130, 0xdc86ba94'93051022'f621a5c1'cb552f03_u128},
+ {Sign::POS, -130, 0xebbeaef9'02b9b38c'91a2a68b'2fbd78e8_u128},
+ {Sign::POS, -130, 0xfadbafc9'6406eb15'6dc79ef5'f7a217e6_u128},
+ {Sign::POS, -129, 0x84ee2cbe'c31b12c5'c8e72197'0cabd3a3_u128},
+ {Sign::POS, -129, 0x8c5fad18'5f8bc130'ca4748b1'bf88298d_u128},
+ {Sign::POS, -129, 0x93c1b902'bf7a2df1'06459240'6fe1447a_u128},
+ {Sign::POS, -129, 0x9b13b9b8'3f5e5e69'c5abb498'd27af328_u128},
+ {Sign::POS, -129, 0xa25521b6'15784d45'43787549'88b8d9e3_u128},
+ {Sign::POS, -129, 0xa9856cca'8e6a4eda'99b7f77b'f7d9e8c1_u128},
+ {Sign::POS, -129, 0xb0a42018'4e7f0cb1'b51d51dc'200a0fc3_u128},
+ {Sign::POS, -129, 0xb7b0ca0f'26f78473'8aa32122'dcfe4483_u128},
+ {Sign::POS, -129, 0xbeab025b'1d9fbad3'910b8564'93411026_u128},
+ {Sign::POS, -129, 0xc59269ca'50d92b6d'a1746e91'f50a28de_u128},
+ {Sign::POS, -129, 0xcc66aa2a'6b58c33c'd9311fa1'4ed9b7c4_u128},
+ {Sign::POS, -129, 0xd327761e'611fe5b6'427c95e9'001e7136_u128},
+ {Sign::POS, -129, 0xd9d488ed'32e3635c'30f6394a'0806345d_u128},
+ {Sign::POS, -129, 0xe06da64a'764f7c67'c631ed96'798cb804_u128},
+ {Sign::POS, -129, 0xe6f29a19'609a84ba'60b77ce1'ca6dc2c8_u128},
+ {Sign::POS, -129, 0xed63382b'0dda7b45'6fe445ec'bc3a8d03_u128},
+ {Sign::POS, -129, 0xf3bf5bf8'bad1a21c'a7b837e6'86adf3fa_u128},
+ {Sign::POS, -129, 0xfa06e85a'a0a0be5c'66d23c7d'5dc8ecc2_u128},
+ {Sign::POS, -128, 0x801ce39e'0d205c99'a6d6c6c5'4d938596_u128},
+ {Sign::POS, -128, 0x832bf4a6'd9867e2a'4b6a09cb'61a515c1_u128},
+ {Sign::POS, -128, 0x8630a2da'da1ed065'd3e84ed5'013ca37e_u128},
+ {Sign::POS, -128, 0x892aecdf'de9547b5'094478fc'472b4afc_u128},
+ {Sign::POS, -128, 0x8c1ad445'f3e09b8c'439d8018'60205921_u128},
+ {Sign::POS, -128, 0x8f005d5e'f7f59f9b'5c835e16'65c43748_u128},
+ {Sign::POS, -128, 0x91db8f16'64f350e2'10e4f9c1'126e0220_u128},
+ {Sign::POS, -128, 0x94ac72c9'847186f6'18c4f393'f78a32f9_u128},
+ {Sign::POS, -128, 0x97731420'365e538b'abd3fe19'f1aeb6b3_u128},
+ {Sign::POS, -128, 0x9a2f80e6'71bdda20'4226f8e2'204ff3bd_u128},
+ {Sign::POS, -128, 0x9ce1c8e6'a0b8cdb9'f799c4e8'174cf11c_u128},
+ {Sign::POS, -128, 0x9f89fdc4'f4b7a1ec'f8b49264'4f0701e0_u128},
+ {Sign::POS, -128, 0xa22832db'cadaae08'92fe9c08'637af0e6_u128},
+ {Sign::POS, -128, 0xa4bc7d19'34f70924'19a87f2a'457dac9f_u128},
+ {Sign::POS, -128, 0xa746f2dd'b7602294'67b7d66f'2d74e019_u128},
+ {Sign::POS, -128, 0xa9c7abdc'4830f5c8'916a84b5'be7933f6_u128},
+ {Sign::POS, -128, 0xac3ec0fb'997dd6a1'a36273a5'6afa8ef4_u128},
+ {Sign::POS, -128, 0xaeac4c38'b4d8c080'14725e2f'3e52070a_u128},
+ {Sign::POS, -128, 0xb110688a'ebdc6f6a'43d65788'b9f6a7b5_u128},
+ {Sign::POS, -128, 0xb36b31c9'1f043691'59014174'4462f93a_u128},
+ {Sign::POS, -128, 0xb5bcc490'59ecc4af'f8f3cee7'5e3907d5_u128},
+ {Sign::POS, -128, 0xb8053e2b'c2319e73'cb2da552'10a4443d_u128},
+ {Sign::POS, -128, 0xba44bc7d'd470782f'654c2cb1'0942e386_u128},
+ {Sign::POS, -128, 0xbc7b5dea'e98af280'd4113006'e80fb290_u128},
+ {Sign::POS, -128, 0xbea94144'fd049aac'1043c5e7'55282e7d_u128},
+ {Sign::POS, -128, 0xc0ce85b8'ac526640'89dd62c4'6e92fa25_u128},
+ {Sign::POS, -128, 0xc2eb4abb'661628b5'b373fe45'c61bb9fb_u128},
+ {Sign::POS, -128, 0xc4ffaffa'bf8fbd54'8cb43d10'bc9e0221_u128},
+ {Sign::POS, -128, 0xc70bd54c'e602ee13'e7d54fbd'09f2be38_u128},
+ {Sign::POS, -128, 0xc90fdaa2'2168c234'c4c6628b'80dc1cd1_u128},
+};
+
+// Degree-13 minimax polynomial generated by Sollya with:
+// > P = fpminimax(atan(x), [|1, 3, 5, 7, 9, 11, 13|], [|1, 128...|],
+// [0, 2^-7]);
----------------
overmighty wrote:
With Sollya 0161d13c:
```
~ ➜ sollya
> P = fpminimax(atan(x), [|1, 3, 5, 7, 9, 11, 13|], [|1, 128...|],
[0, 2^-7]);
Warning in fpminimax: the list of formats is an numerical end-elliptic list.
This is deprecated and will be forbidden in future releases.
>
```
https://github.com/llvm/llvm-project/pull/133150
More information about the libc-commits
mailing list