30
|
R.. GitHub STOP HELPING ICE · 技术社区 · 14 年前 |
![]() |
1
34
这个问题有官僚部分和算法部分。浮点数在内部存储为(2 e _m),其中e是指数(本身为二进制),m是尾数。问题的官僚主义部分是如何访问这些数据,但R.似乎对问题的算法部分更感兴趣,即转换(2 e _m)小数(A/B)。用几种语言回答这个官僚主义问题的答案是“frexp”(这是一个有趣的细节,我以前不知道)。 的确,乍一看,它需要 二 )只写2 e 以小数为单位,尾数还有更多的时间。但是,多亏了 Schonhage-Strassen 快速乘法算法,您可以在_(e)时间内完成,其中tilde表示“最多对数因子”。如果你把Schonhage Strassen看作是魔法,那么想怎么做并不难。如果e为偶数,则可以递归计算2 e/2 然后用快速乘法将其平方。另一方面,如果e是奇数,则可以递归地计算2 E-1 然后加倍。你必须仔细检查是否有Schonhage Strassen的版本在10基。虽然没有广泛的文档记录,但是可以在任何基础上完成。 将一个很长的尾数从二进制转换为基数10的问题并不完全相同,但它有一个相似的答案。你可以把尾数分成两半,m=a 2 K +然后递归地将a和b转换成10进制,将2^k转换成10进制,再做一个快速乘法,以10进制计算m。 所有这些背后的抽象结果是,您可以在_(n)时间内将整数从一个基转换为另一个基。 如果问题是关于标准的64位浮点数,那么对于复杂的Schonhage-Strassen算法来说,它太小了。在这个范围内,您可以使用各种技巧来节省工作。一种方法是存储2的所有2048个值 e 在查找表中,然后在尾数中使用不对称乘法(在长乘法和短乘法之间)。另一个技巧是在10000基(或者10的更大功率,取决于架构)中工作,而不是10基。但是,正如R.在评论中指出的那样,128位浮点数已经允许足够大的指数对查找表和标准长乘法都产生疑问。作为一个实际问题,长乘法是最快的,最多可达几个数字,然后在一个有效的中等范围内可以使用 Karatsuba multiplication 或 Toom-Cook multiplication 之后,Schonhage-Strassen的变化不仅在理论上最好,在实践中也最好。 实际上,大整数包 GMP 已经有了(n)时间基数转换,以及选择乘法算法的良好启发式。他们的解和我的解的唯一区别是,他们不在基10中做任何大的算术,而是在基2中计算10的大幂。在这个解中,它们也需要快速除法,但可以通过几种方法中的任何一种从快速乘法中获得。 |
![]() |
2
16
我看到您已经接受了一个答案,但下面是一些您可能希望查看的此转换的开放源代码实现:
两者都将按您在
|
![]() |
3
5
在打印浮点数字方面有很多工作。黄金标准是打印出一个最小长度的十进制等价物,这样当十进制等价物被重新读取时,无论在重新读取过程中采用什么舍入模式,您都能得到与开始时相同的浮点数。你可以在优秀的 paper by Burger and Dybvig . |
![]() |
4
3
虽然它是c并且你的问题被标记为c,但jon skeet有代码来转换a
从一个快速的视角来看,它似乎不太难移植到C,甚至更容易在C++中编写。 经过进一步的思考,乔恩的算法似乎也是O(e^2),因为它也在指数上循环。但是,这意味着算法是O(对数(n)^2)(其中n是浮点数),我不确定您是否可以在比对数平方时间更好的情况下从基数2转换为基数10。 |
![]() |
5
2
作为一个不擅长浮点运算的专家,我倾向于使用经过良好测试的开放源码库。 这个 GNU MPFR 是一个好的。
|
![]() |
6
1
您可以要求输入比默认值更多的有效数字:
印刷品
|
![]() |
7
0
如果你想要更精确的结果,为什么不使用定点数学呢?转换速度很快。错误是已知的,可以解决。不是你问题的确切答案,而是你的另一个想法。 |
![]() |
8
0
从我的头上看,为什么不先把指数分解成二进制指数的和,那么所有的操作都会损失更少。 即。
然后总结:
我想把它分解成数字的O(n),移位是O(1),求和是O(n)位数… 当然,您必须有一个足够大的整数类来存储结果… 让我知道-我很好奇,这真的让我想起来了。-) |
![]() |
9
0
有三种方法
|
![]() |
10
-2
你不知道。你能做到的最接近的就是转储字节。 |
![]() |
Community wiki · C中有哪些耗时的操作? 1 年前 |
![]() |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
![]() |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
![]() |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |