这个函数是否以3位数的精确精度计算一个数的自然对数?
Does this function compute the natural logarithm of a number with an exact precision of 3 digits?
我的课本中有以下算法,它应该以3位数的精确精度计算一个数字的自然对数。
#include <iostream>
#include <cmath>
double logN(double a, double li, double ls)
{
if(a == 1)
return 0;
else if(fabs(li - ls) < 0.0001)
return (li + ls) / 2;
else if((exp(li) - a) * (exp((li + ls) / 2) - a) < 0)
return logN(a, li, (li + ls) / 2);
else
return logN(a, (li + ls) / 2, ls);
}
int main()
{
std::cout << logN(3, 0, 3) << std::endl;
std::cout << logN(4, 0, 4) << std::endl;
std::cout << logN(5, 0, 5) << std::endl;
return 0;
}
这个语句看起来不对:
else if(fabs(li - ls) < 0.0001)
例如,如果我有两个数字:0.9992
和0.9996
。两个数字的前3位数字相等,但它们之间的差异是0.0004
大于0.0001
,因此测试将失败。我错过了什么?
这是(li + ls) / 2
正常工作所必需的。
0.999 - 0.9981 = 0.0009 < 0.001
但:
(0.999 + 0.9981) / 2 = 0.99855
另一方面:
(0.9999 + 0.9998) / 2 = 0.99985
当四舍五入到第三位时,其四舍五入为1。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '