首页 > 解决方案 > 如何在 C99 中制作数学对数函数?

问题描述

我终于重新开始构建我的函数,这是我在制作实际的 BPML 语言之前正在做的事情。在第 3 部分 - 数学中,我想做一些对数函数。

一开始我不知道对数函数是什么,但随着我的深入,我学会了它并做了这个:

float log_num(int num) {
    int mult;
    float result = 0;
    for (int i = 0; ; i++) {
        mult = 10 ^ i;
        if (mult >= num) {
            result = i;
            break;
        }
    }
    return result;
}

log_num只支持int并且将floatdouble它们单独的。

现在我遇到了这个函数的两个问题:

  1. 当我尝试运行它并100用作函数中的数字时,结果应该是2.00,但它给了我1.00.
  2. 由于要返回的值是 a float,如果它不是 10 的幂,我希望函数实际上给我不同的值。它的一个例子是2 = 0.30102999566398119521373889472449

问:如何解决问题 1 以及如何使功能按照问题 2 中的说明工作?

我想从头开始制作这个功能,而不是依赖其他功能。

标签: cfunctionmathfloating-point

解决方案


问:如何解决问题 1 ...?

10 ^ i与10异或i。它不是 10 i

求 log 10 (num)的整数部分

int i_portion = 0;
if (num <= 0) Handle_elsewhere();
else {
  int i_portion = 0;
  int n = num;
  while (n >= 10) {
    n /= 10;
    i_portion++;
  } 
  printf("%d\n", i_portion);
} 

问:...以及如何使函数像我在问题 2 中解释的那样工作?

以下是自 C99 以来的快速解决方案:

#include <math.h>
float log_num(int num) {
  return log10f(num);
}

没有编码<math.h>是相当广泛的。为了高效施工,我们需要设计参数。

首先,要明确基数。标准log()是基数e,而不是问题所暗示的基数 10 。

角落/错误处理:您想如何处理负面输入?记录任何正基数(0) 通常返回为 -∞。对于有限的正值,没有范围问题。+∞,也许 +∞ 应该返回什么?NaN应该返回什么,也许是 NaN?

准确度/精确度:您想要最好的结果还是愿意为速度或小代码足迹而放弃准确度?为什么返回float与更常见double

性能:只是运行时性能差的代码好吗?只需按对数计算编码。由于目标包括my_log_i(int), my_log_f(float), my_log_d(double),现在,只需编写代码my_log_d(double)并让其他人调用它。

便携性——便携性如何?


当然我们可以编写一个简单float my_log_10(int)的代码,但是如果没有设计细节,结果会在很多方面有所欠缺。


推荐阅读