c - 如何在 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
并且将float
有double
它们单独的。
现在我遇到了这个函数的两个问题:
- 当我尝试运行它并
100
用作函数中的数字时,结果应该是2.00
,但它给了我1.00
. - 由于要返回的值是 a
float
,如果它不是 10 的幂,我希望函数实际上给我不同的值。它的一个例子是2 = 0.30102999566398119521373889472449
。
问:如何解决问题 1 以及如何使功能按照问题 2 中的说明工作?
我想从头开始制作这个功能,而不是依赖其他功能。
解决方案
问:如何解决问题 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)
的代码,但是如果没有设计细节,结果会在很多方面有所欠缺。
推荐阅读
- python-3.x - 如何从 Selenium 中的文本节点检索文本
- python - 如何在 python 的给定列表中找到最接近 k 的数字?
- sql - HANA DB 中 json_object 的等效函数
- td-engine - TDengine 在查询中重命名结果
- flutter - 如果应用程序已打开,则 Flutter Local Notifications onSelectNotification Navigator 不起作用
- python - 计算数据框熊猫中所有联盟的百分比
- java - 为什么我在 Java 中得到不同的加法和错误
- flutter - 将 firestore 数据下载到 Flutter List
- powershell - 使用循环和输出创建 CSV
- typescript - 使用 node js 下载文件