Tag: 浮点

为什么这个浮点数的值会改变它的设置?

为什么这个C程序输出“错误”? #include void main() { float f = 12345.054321; printf(“%f”, f); getch(); } 输出: 12345.054688 但输出应为12345.054321 。 我在VS2008中使用VC ++。

将float转换为字符串而不使用sprintf()

我正在编写基于微控制器的应用程序,我需要将float转换为字符串,但我不需要与sprintf()相关的繁重开销。 有没有雄辩的方法来做到这一点? 我不需要太多。 我只需要2位数的精度。

在浮点中实现pow()函数的最有效方法

我正在尝试实现我自己的pow()和sqrt()函数版本,因为我的自定义库没有pow()/ sqrt()浮点支持。 有人可以帮忙吗?

浮点运算的准确性

我无法理解这个程序的输出 int main() { double x = 1.8939201459282359e-308; double y = 4.9406564584124654e-324; printf(“%23.16e\n”, 1.6*y); printf(“%23.16e\n”, 1.7*y); printf(“%23.16e\n”, 1.8*y); printf(“%23.16e\n”, 1.9*y); printf(“%23.16e\n”, 2.0*y); printf(“%23.16e\n”, x + 1.6*y); printf(“%23.16e\n”, x + 1.7*y); printf(“%23.16e\n”, x + 1.8*y); printf(“%23.16e\n”, x + 1.9*y); printf(“%23.16e\n”, x + 2.0*y); } 输出是 9.8813129168249309e-324 9.8813129168249309e-324 9.8813129168249309e-324 9.8813129168249309e-324 9.8813129168249309e-324 1.8939201459282364e-308 1.8939201459282364e-308 1.8939201459282369e-308 1.8939201459282369e-308 1.8939201459282369e-308 我正在使用IEEE算法。 […]

使用浮点数和整数

我已经创建了一个ATM程序,它将钱存入一个人的账户。 当该人取出提款时,它会从账户中扣除50%的附加费。 我遇到的问题是在这个程序中使用整数和浮点数。 我将整数帐户转换为浮点数,但是当我尝试打印语句时收到错误消息。 有人能告诉我我做错了什么吗? #include int main (void) { int account = 2000; int withdrawal; float charge = 0.50; printf (“How much money would you like to take out? “); scanf (“%i”, &withdrawal); while (withdrawal % 5 != 0) { printf (“Withdrawal must be divisible by 5. “); scanf(“%i”, &withdrawal); } account = ((float) […]

为什么printf使用float和integer格式说明符打印随机值

我在64位机器上写了一个简单的代码 int main() { printf(“%d”, 2.443); } 所以,这就是编译器的行为方式。 它将识别第二个参数为double,因此它将在堆栈上推送8个字节,或者可能只是在调用之间使用寄存器来访问变量。 %d需要一个4字节的整数值,因此它会输出一些垃圾值。 有趣的是,每次执行此程序时,打印的值都会发生变化。 那么发生了什么? 我希望它每次打印相同的垃圾值,而不是每次都不同。

C:将double转换为float,保留小数点精度

我想在C中将double转换为float,但希望尽可能保留小数点而不做任何更改… 例如,让我说我有 double d = 0.1108; double dd = 639728.170000; double ddd = 345.2345678 现在纠正我,如果我错了,我知道点后面的浮点精度大约是5个数字。 我可以在点之后得到那五个数字吗? 以上结果如下: float f = x(d); float ff = x(dd); float fff = x(ddd); printf(“%f\n%f\n%f\n”, f, ff, fff); 它应该打印 0.1108 639728.17000 345.23456 精度限制之后的所有数字(我假设为5)将被截断。

为什么“for(i = 0.1; i!= 1.0; i + = 0.1)”在i = 1.0时不会中断?

我今天参加了C考试,我被问到类似的问题: 这个程序有什么问题: for( x = .1 ; x != 1.0 ; x += .1) printf(“%f\n”, x); 我无法解决它,因为我必须写一些我标记为.1的错误。 但是,当我回到家里时,我运行这个程序,结果certificate当x等于1.0并且陷入无限循环时它不会中断: $ cat exam.c #include int main(int argc, char **argv) { float x; for(x = .1 ; x != 1.0 ; x += .1) printf(“%f\n”, x); return 0; } $ gcc exam.c -o exam $ ./exam 0.100000 0.200000 […]

对于未设置的值,使用IEEE754浮点NaN是一个好主意吗?

对于非数学原因未定义的值,使用IEEE754浮点NaN(非数字)是一个好主意吗? 在我们的情况下,它们尚未设置,因为尚未从其他设备接收到值。 上下文是使用IEC1131 REAL32值的嵌入式系统。 编辑:编程语言是C,所以我们很可能使用来自C99的NAN和isnanf(x)。 虽然我们可能需要一些额外的扭曲来将这些扭曲到我们的操作系统兼容性层中。 编程语言中的默认设置似乎是初始化具有正零的浮点变量,其内部表示全为零。 这对我们来说是不可用的,因为0在有效值的范围内。 使用NaN似乎是一个干净的解决方案,但也许它比它的价值更麻烦,我们应该选择其他一些价值?

C和C ++标准的数学精度要求

在C和C ++标准中,是否需要在math.h对浮点(即sqrt , exp , log , sin ,…)进行数学运算才能返回数值最佳解? 对于给定的(精确且有效的)输入,通常显然不是这些函数的精确浮点输出。 但输出是否必须是最接近数学上精确值的可表示值? 如果没有,是否有任何关于精度的要求(可能是平台特定的/在其他标准中?),以便我能够在我的代码中对计算错误进行最坏情况估计? 现代实施的数值误差的典型限制是什么?