最近我在做一些关于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
我做得对吗?
答案 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...
});
的开源实现。