我创建了以下程序来查找浮点数的位模式。但我得到了不同的然后我计算:
#include<stdio.h>
int main(void){
float f = 1.234;
char *ch;
ch = (char *)(&f);
printf("\n%d\n", *ch);
ch++;
printf("\n%d\n", *ch);
ch++;
printf("\n%d\n", *ch);
ch++;
printf("\n%d\n", *ch);
// printf("%d %d %d %d", *ch, *(ch+1), *(ch+2), *(ch+3));
printf("\n%f %e", f, f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给了我输出:
-74
-13
-99
63
1.234000 1.234000e+00
Run Code Online (Sandbox Code Playgroud)
这是什么意思,因为我期望位模式为:
00111111 10111011 11100111 0110110
我错的地方请纠正我
首先,请允许我承认我是一名经验丰富的程序员,拥有超过 10 年的编程经验。然而,我在这里问的问题是自从大约十年前我第一次拿起一本关于 C 的书以来一直困扰着我的问题。
\n\n下面是一本关于Python的书的摘录,解释了Python的浮动类型。
\n\n\n\n\n浮点数使用机器上浮点数的本机双精度(64 位)表示形式来表示。通常这是 IEEE 754,它提供大约 17 位精度和范围在 \xe2\x80\x93308 到 \n 308 的指数。这与 C 中的 double 类型相同。
\n
我一直不明白这句话的含义
\n\n\n\n\n“...提供大约 17 位精度和 \n 指数,范围为 \xe2\x80\x93308 到 308 ...”
\n
我的直觉在这里误入歧途,因为我可以理解精度的含义,但范围怎么可能与此不同。我的意思是,如果一个浮点数可以表示最多 17 位的值(即最多 1,000,000,000,000,000,00 - 1),那么指数怎么可能是 +308。如果指数为 10,这不会产生 308 位数字;如果指数为 2,这不会产生大约 100 位数字。
\n\n我希望我能够表达我的困惑。
\n\n问候\nVaid,阿布舍克
\n如何将数字从双精度转换为单精度并返回?
例如,我在 Java/C/C# 中有这样的:
double x = 0.00001;
float f = (float)x; // should be 0.000009999999747378752 not 0.0000100000000000000008180305391403
int n = Math.floor(1001 * f / x); // should be 1000 not 1001.
Run Code Online (Sandbox Code Playgroud)
(别问。这是一些毛茸茸的 C 代码的简化版本,我需要 1:1 移植它)
另一个例子:
double y = Math.floor((double)(float)5.999999876); // should be 6.0
Run Code Online (Sandbox Code Playgroud)
我已经尝试过的:
var f:float = x; // syntax error
var f = x as float; // syntax error
var f = parseFloat(x); // returns full double-precision (0.0000100000000000000008180305391403)
var f = toFixed(x, ...); // Can't use …Run Code Online (Sandbox Code Playgroud) 我试图将这些数字转换为二进制科学记数法,但我无法弄清楚这个过程。有人可以请解决这个问题的过程吗?
对于 IEEE 754 单精度浮点数,用二进制科学记数法书写的数字是多少,其十六进制表示如下?
0061 0000
我可以将其从十六进制转换为无符号二进制:
0000 0000 0110 0001 0000 0000 0000 0000
但我无法弄清楚如何使用二进制科学记数法正确表示这一点。提前致谢!
我正在 Python (Numpy) 和 R 中进行数据分析。我的数据是一个向量 795067 X 3,根据我使用 Numpy 还是 R 计算该数据的平均值、中位数、标准差和 IQR 会产生不同的结果。我交叉检查值,看起来 R 给出了“正确”的值。
Median:
Numpy:14.948499999999999
R: 14.9632
Mean:
Numpy: 13.097945407088607
R: 13.10936
Standard Deviation:
Numpy: 7.3927612774052083
R: 7.390328
IQR:
Numpy:12.358700000000002
R: 12.3468
Run Code Online (Sandbox Code Playgroud)
两个平台上数据的最大值和最小值相同。我进行了快速测试,以更好地了解这里发生的情况。
在 Numpy 中,数字是 float64 数据类型,而在 R 中数字是 double。这是怎么回事?为什么 …
在C中,在使用IEEE-754浮点数的实现中,当我比较两个NaN的浮点数时,它返回0或"false".但是为什么两个浮点数都被认为是相等的呢?
这个程序打印"相等:......"(至少在Linux AMD64下使用gcc),在我看来它应该打印"不同:......".
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
volatile double a = 1e200; //use volatile to suppress compiler warnings
volatile double b = 3e200;
volatile double c = 1e200;
double resA = a * c; //resA and resB should by inf
double resB = b * c;
if (resA == resB)
{
printf("equal: %e * %e = %e = %e = %e * %e\n",a,c,resA,resB,b,c);
}
else
{
printf("different: %e * %e = %e != %e = %e * …Run Code Online (Sandbox Code Playgroud) 以下C代码:
int main()
{
float f;
f = 3.0;
}
Run Code Online (Sandbox Code Playgroud)
转换为以下汇编指令:
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
flds .LC0
fstps -4(%ebp)
movl $0, %eax
leave
ret
.LC0:
.long 1077936128
Run Code Online (Sandbox Code Playgroud)
计算文字的.long/int表示的正确方法是什么float?
例如 1077936128从3.0上面显示的示例生成
对于此示例
gcc,-m32 -S -O0 -fno-stack-protector -fno-asynchronous-unwind-tables使用英特尔设置与标志一起使用以生成程序集输出。
参考资料:
带有编译标志和其他设置的编译器资源管理器链接
我一直在阅读,似乎 IEEE 754 将 64 位浮点数(双)指数定义为 11 位。( https://en.wikipedia.org/wiki/Double-precision_floating-point_format )
我的问题是为什么?
64 位浮点数有 53 位有效数(第一位暗示为 1,因此实际仅存储 52 位)-因此您需要指数至少能够表示数字 53(以便能够移动二进制基数指向有效数中的任何位置),因此现在您需要 7 位。
然后你还需要负指数,所以 8 位。
此外,您还需要表示 0、负无穷大和正无穷大以及 NaN-(需要 4 个额外的表示),所以我猜是 10 位。
所以我的问题是:为什么指数是 11 位而不是 10 或 12 位,以及如何确定其他长度的浮点数?
我正在使用以下算法进行双精度除法,并尝试使其在浮点软件模拟中正确舍入。设a为被除数,b为除数。
所有操作均在 Q2.62 中执行。
b/2是b的有效数,加上其隐含位,并右移一位。接下来,当写成a或b时,它的意思是a或b的有效数加上其隐含位。
这
近似为0x17504f333f9de6( 0x5D413CCCFE779800Q2.62 中的)。
对于倒数r有 6 次这样的迭代。商q是通过将r乘以a(的有效数)来计算的。
最终的舍入结果为:
if a <= (a - q * b/2):
result = final_biased_exponent | q
else
result = final_biased_exponent | adjusted_q
Run Code Online (Sandbox Code Playgroud)
除以下两种情况外,此方法可以正常工作:a)结果低于正常值或 b)a和b均低于正常值。在这些情况下,它不会正确舍入,并且结果会偏离 1 位(与 x86 结果相比)。(数字a和b被归一化,并且当a或b中的任何一个被归一化时,指数也会相应地缩放。) …
floating-point numerical-computing ieee-754 numerical-analysis
我必须使用 IEEE-754对电子电荷进行编码,即 -1.602*10 -19 C。我手动完成并使用此站点验证了我的结果。所以我知道我的代表是好的。我的问题是,如果我尝试构建一个以科学记数法显示我的数字的 C 程序,我会得到错误的数字。
这是我的代码:
#include <stdio.h>
int main(int argc, char const *argv[])
{
float q = 0xa03d217b;
printf("q = %e", q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
$ ./test.exe
q = 2.688361e+09
Run Code Online (Sandbox Code Playgroud)
我的问题:除了 IEEE-754 之外,还有其他表示我的 CPU 可能在内部用于浮点吗?