如何在 C 中打印直到所需最后一位的所有十进制数?
How to print all the decimal numbers up to the required last digit in C?
如果指数是负数,我需要以十进制形式打印整个答案。但是 float
只有 6 位小数。因为如果答案超过小数点后 6 位,结果只会是 0.000000
。我应该使用其他数据类型还是什么?
#include <stdio.h>
#include <math.h>
float power(int base, int exponent);
int main() {
int base, exponent;
float result;
printf("Enter a base number: "); scanf("%d", &base);
printf("Enter an exponent: "); scanf("%d", &exponent);
result = power(base, exponent);
printf("Power of %d^%d = %f", base, exponent, result);
return 0;
}
float power(int base, int exponent) {
float result = 1;
while (exponent < 0) {
{
result = result / base;
exponent++;
}
}
while (exponent != 0) {
result = result * base;
exponent--;
}
return result;
}
打印说明符
因为float
是一个浮动点数(尾数和指数),使用"%e"
或"%g"
以指数形式显示数字符号而不是 "%f"
.
的固定符号
printf("%e\n", result); // exponential
printf("%g\n", result); // exponential for large and tiny values
printf("%a\n", result); // exponential, but with a hexadecimal significand.
要打印超过 6 位有效小数位的默认值,请使用可选的 精度:
printf("%.8e\n", result); // 1 + 8 significant decimal places.
由于 float
在内部存储一个二进制有效位的值,并且 OP 可能需要十进制输出,因此打印太少既不明智,也不能提供信息来打印太多有效的小数位。对于 float
,考虑使用 FLT_DECIMAL_DIG
(通常为 9)来指导打印的小数精度。
#include <float.h>
printf("%.*e\n", FLT_DECIMAL_DIG-1, result);
// or
printf("%.*g\n", FLT_DECIMAL_DIG, result);
类型
正如 所建议的那样,在 C 中考虑 double
而不是 float
。它是默认的浮点类型,具有 53 位二进制精度(~17 位十进制左右) .
注释
像 result/base
(float/int
) 和 result*base1
这样的代码可能会在每次迭代时产生少量舍入误差。 exponent
越高,越有可能出错。
“打印所有十进制数到要求的最后一位”可以得到一些heavy details.
平方求幂
与其循环,不如考虑 Exponentiation by squaring:更快更准确。
double pow_f(int ibase, int exponent) {
unsigned expo = exponent < 0 ? 0u - exponent : exponent;
double base = ibase;
double pow = 1.0;
while (expo > 0) {
if (expo % 2) {
pow *= base;
}
base *= base;
expo /= 2;
}
if (ibase < 0) {
pow = 1.0/pow;
}
return pow;
}
简答:“%.Nf”,其中N就是你要的点后的位数。
--- 但是 ---
长答案:
- 点后的有效(即有用)数字的数量取决于您机器上“浮点数”的表示形式以及值的大小。在大多数系统上,“浮点”类型是 IEEE 754 单精度,它有 23 位尾数。这大致对应于 7 个十进制数字,包括小数点之前的数字。如果数字足够大,点后的none位是有意义的。
- 由于以 2 为底的表示形式,大多数以 10 为底的表示具有有限数量的非零数字的值无法准确表示。
如果指数是负数,我需要以十进制形式打印整个答案。但是 float
只有 6 位小数。因为如果答案超过小数点后 6 位,结果只会是 0.000000
。我应该使用其他数据类型还是什么?
#include <stdio.h>
#include <math.h>
float power(int base, int exponent);
int main() {
int base, exponent;
float result;
printf("Enter a base number: "); scanf("%d", &base);
printf("Enter an exponent: "); scanf("%d", &exponent);
result = power(base, exponent);
printf("Power of %d^%d = %f", base, exponent, result);
return 0;
}
float power(int base, int exponent) {
float result = 1;
while (exponent < 0) {
{
result = result / base;
exponent++;
}
}
while (exponent != 0) {
result = result * base;
exponent--;
}
return result;
}
打印说明符
因为float
是一个浮动点数(尾数和指数),使用"%e"
或"%g"
以指数形式显示数字符号而不是 "%f"
.
printf("%e\n", result); // exponential
printf("%g\n", result); // exponential for large and tiny values
printf("%a\n", result); // exponential, but with a hexadecimal significand.
要打印超过 6 位有效小数位的默认值,请使用可选的 精度:
printf("%.8e\n", result); // 1 + 8 significant decimal places.
由于 float
在内部存储一个二进制有效位的值,并且 OP 可能需要十进制输出,因此打印太少既不明智,也不能提供信息来打印太多有效的小数位。对于 float
,考虑使用 FLT_DECIMAL_DIG
(通常为 9)来指导打印的小数精度。
#include <float.h>
printf("%.*e\n", FLT_DECIMAL_DIG-1, result);
// or
printf("%.*g\n", FLT_DECIMAL_DIG, result);
类型
正如 double
而不是 float
。它是默认的浮点类型,具有 53 位二进制精度(~17 位十进制左右) .
注释
像 result/base
(float/int
) 和 result*base1
这样的代码可能会在每次迭代时产生少量舍入误差。 exponent
越高,越有可能出错。
“打印所有十进制数到要求的最后一位”可以得到一些heavy details.
平方求幂
与其循环,不如考虑 Exponentiation by squaring:更快更准确。
double pow_f(int ibase, int exponent) {
unsigned expo = exponent < 0 ? 0u - exponent : exponent;
double base = ibase;
double pow = 1.0;
while (expo > 0) {
if (expo % 2) {
pow *= base;
}
base *= base;
expo /= 2;
}
if (ibase < 0) {
pow = 1.0/pow;
}
return pow;
}
简答:“%.Nf”,其中N就是你要的点后的位数。
--- 但是 ---
长答案:
- 点后的有效(即有用)数字的数量取决于您机器上“浮点数”的表示形式以及值的大小。在大多数系统上,“浮点”类型是 IEEE 754 单精度,它有 23 位尾数。这大致对应于 7 个十进制数字,包括小数点之前的数字。如果数字足够大,点后的none位是有意义的。
- 由于以 2 为底的表示形式,大多数以 10 为底的表示具有有限数量的非零数字的值无法准确表示。