在c ++

时间:2017-09-27 11:34:45

标签: c++

最近我在做一些关于c ++类型的研究,我有几个关于long double的问题。例如,我有一些数字long double x = -48.12e4,那么我应该多准确地将0.12转换为十六进制或二进制(我更喜欢使用十六进制,更容易阅读)。在实施方案中,我有1个额外的位,我不知道它的作用 -

//scheme 
1bit    15bit   1bit   63bit 
sign    e        1       m

例如,让我们记下我之前写过的数字。

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 

我做得对吗?

2 个答案:

答案 0 :(得分:1)

来自cppreference(强调我的):

  

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

您假设long double的特定布局不受标准保证,但可能因编译器而异,具体取决于目标架构。

答案 1 :(得分:0)

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

特别是,-48.12e4被指定为符号,尾数,指数,以及long double的C ++实现如何工作,但指数的隐式基数不同。 e4表示幂为10,但long double使用base-2(或base-16,或其他二进制库)。

结果是编译器不能只转换指数。 10 ^ 3 大约 2 ^ 10,但对于float long double long double(4812)来说甚至不够近。

因此,正确的解决方案要困难得多。也许最简单的解决方案是计算long double(1e2)long double,并将它们相乘。这样,您只需要将整数转换为long double,将10的幂转换为long double

将10的小正幂转换为pow(10,n)=1.0/pow(10,-n)也很容易,重用整数代码。对于大的均匀正幂,使用平方。对于10的负幂,请使用strtod()

这一事实

要了解真正的编译器是如何做到的(效率更高一些),请查看$("#addCustomer").one("click", function(event) { //Add another dropdown customer list... }); 的开源实现。