Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
长双机在C++中的实现 最近我在C++中做了一些研究,我有一些关于双加法的问题。例如,我有一些数字长的双x=-48.12e4,那么我应该如何准确地将0.12转换为十六进制或bin,我更喜欢使用十六进制,更容易阅读。在实施方案中,我有一个额外的位,我不知道它的作用- //scheme 1bit 15bit 1bit 63bit sign e 1 m_C++ - Fatal编程技术网

长双机在C++中的实现 最近我在C++中做了一些研究,我有一些关于双加法的问题。例如,我有一些数字长的双x=-48.12e4,那么我应该如何准确地将0.12转换为十六进制或bin,我更喜欢使用十六进制,更容易阅读。在实施方案中,我有一个额外的位,我不知道它的作用- //scheme 1bit 15bit 1bit 63bit sign e 1 m

长双机在C++中的实现 最近我在C++中做了一些研究,我有一些关于双加法的问题。例如,我有一些数字长的双x=-48.12e4,那么我应该如何准确地将0.12转换为十六进制或bin,我更喜欢使用十六进制,更容易阅读。在实施方案中,我有一个额外的位,我不知道它的作用- //scheme 1bit 15bit 1bit 63bit sign e 1 m,c++,C++,例如,让我们以我以前写过的数字为例 1)translate decimal to hex -48.12 = -3.1E (are 2 digits after decimal enough?) 2)normalization 0011.0001 1110 * 10^0 = 001.1 0001 1110 * 10^1 3)calculation of "e" 16 383 + 4 + 1 = 16 388 = 4004(hex) = 0100 0000 0000 0100 4)co

例如,让我们以我以前写过的数字为例

1)translate decimal to hex 
-48.12 = -3.1E (are 2 digits after decimal enough?)

2)normalization 
0011.0001 1110  * 10^0 =  001.1 0001 1110 * 10^1

3)calculation of "e"
16 383 + 4 + 1 = 16 388 = 4004(hex) = 0100 0000 0000 0100

4)collecting everything together
1    0100 0000 0000 0100   1    1000 1111 0000 0..0
sign|        e           |bit|      mantisa 
What is that 1 bit for?
5)reverse order
0..000  0011 1100 0110  0000 0010  1010 0000 
我做的一切都对吗?

我的重点:

长双扩展精度浮点型。不 必须映射到IEEE-754规定的类型。通常为80位x87 x86和x86-64体系结构上的浮点类型


您假设一个特定的长双精度布局,该布局绝对不受标准的保证,但可能因编译器而异,具体取决于目标体系结构。

您遇到的问题是您正在进行十进制计算。这对人类来说是合乎逻辑的,但不是计算机的工作方式

特别是,-4812E4被指定为符号、尾数、指数,这也是长双工的C++实现方式,但指数的隐式基础不同。e4表示10的幂,但long double使用base-2或base-16,或另一个二进制基数

结果是编译器不能只转换指数。10^3约为2^10,但距离不够近,不足以让长双精度浮动

因此,正确的解决方案要困难得多。也许最简单的解决方案是计算长双精度4812和长双精度1E2,然后将它们相乘。这样,您只需要实现整数到长双精度的转换,以及10的幂到长双精度的转换

将10的小正幂转换为长双倍也很容易,重用整数代码。对于大的甚至是正的幂,使用平方。对于10的负幂,使用pow10,n=1.0/pow10,-n这一事实


要想了解真正的编译器是如何做到这一点的(效率更高),请查看strod的开源实现。

Read;长双精度在x86-64和ARM64上是不同的…为什么不使用和%La格式说明符打印值呢?至少它应该告诉你当前平台上的十六进制浮点值是多少。如果你不了解它是如何完成的,那么你看到结果的感觉是什么?这样你就可以很容易地看到你是否正确,或者按照你的方式反向工作了?@mch:是的,但是长双精度不使用2的补码,这只适用于整型。这句话并没有特别的帮助。确实,长双精度不一定映射到IEEE-754规定的类型,但双精度或浮点型也不一定映射到。只要满足范围要求,C++标准就不需要任何浮点类型的特定表示。@ PeteBecker可能是没有特别帮助的。我没有真正理解这个问题。然而,除非有更好的答案,否则我将把它留在这里,保留答案。是的,虽然有点薄;只是引语有点误导。现在你有一票优势;那是我的。@PeteBecker啊,好吧,那么你是在抱怨引用中只提到了长双精度,而其他类型的几乎都是如此?