1
8
编译器设置中有快速浮动操作。你需要精确的漂浮操作。问题是log10(8)/log10(2)在数学上总是3。但你的结果可能是2.99999,举例来说。这很糟糕。必须添加少量添加剂,但不能添加0.5。应该是0.00001或者类似的。 几乎正确的公式:
真正的解决方案
你应该检查一下你的公式的结果。紧性是
这个检查比用强力测试好
|
2
7
以下任何一项都有效:
第一个版本在
mathpath.org
. 在第二版中,
十进制示例:
二元的:
编辑
:操作说明
此代码的效率可能会降低。和
对
它是为最大的模糊点而写的。它只需观察每个数字至少有一个数字,每个除数
|
4
3
由于您的公式是正确的(我刚刚尝试过),我认为这是您的除法中的舍入错误,导致数字略小于它应该是的整数值。所以当你截短为一个整数时,你会损失1。尝试在最终值中添加额外的0.5(这样截断实际上是一个圆形操作)。 |
5
2
你要的是上限(=最小整数不大于)对数 乙 (n+1),而不是你现在计算的,楼层(1+对数) 乙 (n)。 你可以试试:
|
6
1
正如其他人所指出的,你有舍入误差,但所提出的解决方案只是移动危险区或缩小危险区,它们并不能消除它。如果您的数字是整数,那么您可以验证-- 使用整数算术 --底数的一次幂小于或等于数字,下一次幂大于它(第一次幂是位数)。但是,如果在链的任何地方使用浮点运算,那么您将容易出错(除非您的基数是2的幂,甚至可能是2的幂)。
编辑:
size = 0, k = 1; while(k<=num) { k *= base; size += 1; } |
7
1
用你的公式,
问题在于对数计算的精度。使用
应该解决那个问题。这和
因为这给出了n=8b=2的答案3,也不等于
因为这给出了n=7b=2的答案4(当计算到完全精度时)。 实际上,我得到了一些奇怪的结果,用g++实现和编译第一个表单:
失败(即给出答案3),而,
成功(给出答案4)。再看一看,我想是第三种形式
会更稳定,因为它避免了当n(或n+1表示第二种形式)是b的整数幂(表示n的整数值)时的“临界”情况。 |
8
0
将舍入函数(例如+0.5)包装到代码中的某个地方可能会很有好处:很可能是该部门正在生成(例如)2.99989787,其中添加了1.0,得到3.99989787,当转换为int时,得到3。 |
9
0
我觉得这个公式是对的:
所以这绝对只是一个舍入误差。 |
10
0
浮点舍入问题。
但不能按建议添加0.5,因为它不适用于以下内容
也许使用log(value,base)函数可以避免这些舍入错误。 |
11
0
我认为消除舍入误差而不产生其他误差的唯一方法是使用或实现整数对数。 |
12
0
下面是bash中的一个解决方案:
|
13
0
|
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |
Wadu Hek · 查找列表中唯一的重复项 2 年前 |
Crawford Patten · 如何获得整数列表的四分位数 2 年前 |
MoonGoose · 如何在python中围绕特殊字符创建空间? 2 年前 |
taha khamis · 在一个数字中组合元素的省道 2 年前 |
Soup · 比O(n)更快地找到阶乘n模m 2 年前 |
BigO · 单词积分游戏不断增加数字[关闭] 2 年前 |