如何在 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就是你要的点后的位数。

--- 但是 ---

长答案:

  1. 点后的有效(即有用)数字的数量取决于您机器上“浮点数”的表示形式以及值的大小。在大多数系统上,“浮点”类型是 IEEE 754 单精度,它有 23 位尾数。这大致对应于 7 个十进制数字,包括小数点之前的数字。如果数字足够大,点后的none位是有意义的。
  2. 由于以 2 为底的表示形式,大多数以 10 为底的表示具有有限数量的非零数字的值无法准确表示。