【问题标题】:How to make math logarithm functions in C99?如何在 C99 中制作数学对数函数?
【发布时间】:2020-10-18 12:39:56
【问题描述】:

我终于重新开始构建我的函数,这是我在制作实际的 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 只支持intfloatdouble 会有各自的。

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

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

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

我想从头开始制作函数,而不是依赖其他函数。

【问题讨论】:

  • 您希望如何在不使用所述数字的情况下计算数字的对数?
  • 由于代码中唯一影响result值的语句是float result = 0;result = 1;,你认为这个函数怎么可能返回2?
  • 你认为10 ^ i 会做什么?
  • ^ 不是 C 中的指数运算符。它是 XOR 运算符。

标签: c function math floating-point


【解决方案1】:

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

10 ^ i 是 10 exclusive-or'edi。它不是 10i

求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);
}

没有&lt;math.h&gt; 的代码是相当广泛的。为了高效施工,我们需要设计参数。

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

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

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

性能:只是运行时性能较差的代码好吗?只需按Logarithm Calculation 编码即可。由于目标包括my_log_i(int), my_log_f(float), my_log_d(double),所以现在只需编码my_log_d(double) 并让其他人调用它。

便携性 - 便携性如何?


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多