Java 中的 Base 2 自定义方法和近似值
Base 2 custom method and approximation in Java
我正在编写一种网络计算器方法,用于计算给定多个主机需要多少位。这段代码给我带来了一些问题:
int hostBits = (int) Math.ceil(Math.log(hosts) / Math.log(2));
它适用于小数字,但当我输入大数字时出现问题,比如 2^31 - 2,因为 Math.log(hosts) / Math.log(2)
(改变对数的底数)的结果应该是 31.0,实际上是 31.000000000000004.
然后,Math.ceil(...)
把 31.000000000000004 变成 32 而不是我想要的 31。
有人知道如何解决这个问题吗?
四舍五入时尝试使用 epsilon
int hostBits2 = (int) Math.ceil(Math.log(hosts) / Math.log(2)+1e-10);
不是问题。
问题仅在于,当一个数字被除时,例如两个不同的整数 (int's),特别是“数学”和对数方法的结果是可能需要的“精度”是一些自定义级别或原始类型的默认级别,例如 double - 因此小数点后有额外的小数位。
两点,首先,当一个数字被除法时,技术上只是一个整数,例如12 / 3 = 6 与数学和作为原始类型 double 它总是有小数点后跟大约六个零左右和末尾不是 0 的数字。其次,从数学库中可能看起来更糟,您可以从除法而不是小数位获得对数符号。
最后一点,Math 库直到它知道答案是什么,所以使用 double 类型是一种自动转换,无论您如何编写它以保证精度和数据类型的安全。
数据类型的自动交换称为提升(将精度提高为浮点数)或降级(将精度降低为浮点数)
并且要将其转换为整数,它会按照小数点后第一位的规则向上或向下舍入,因此您基本上只需要将答案放入“new Double(primativedoubletype)”对象中并使用它的“intValue”方法。
NB 将 (int) cast 放在它前面只能确保它在分配(通常从表达式或方法)到 int 变量时是一个 int,但是它不是提取另一个值的方法类型为 int,原始类型必须通过其标准 java 类型 class 对象及其 primatves 转换器方法进行转换。
int hostBits2 = new Double((double)Math.ceil(Math.log(hosts) / Math.log(2)+1e-10)).intValue();
我正在编写一种网络计算器方法,用于计算给定多个主机需要多少位。这段代码给我带来了一些问题:
int hostBits = (int) Math.ceil(Math.log(hosts) / Math.log(2));
它适用于小数字,但当我输入大数字时出现问题,比如 2^31 - 2,因为 Math.log(hosts) / Math.log(2)
(改变对数的底数)的结果应该是 31.0,实际上是 31.000000000000004.
然后,Math.ceil(...)
把 31.000000000000004 变成 32 而不是我想要的 31。
有人知道如何解决这个问题吗?
四舍五入时尝试使用 epsilon
int hostBits2 = (int) Math.ceil(Math.log(hosts) / Math.log(2)+1e-10);
不是问题。
问题仅在于,当一个数字被除时,例如两个不同的整数 (int's),特别是“数学”和对数方法的结果是可能需要的“精度”是一些自定义级别或原始类型的默认级别,例如 double - 因此小数点后有额外的小数位。
两点,首先,当一个数字被除法时,技术上只是一个整数,例如12 / 3 = 6 与数学和作为原始类型 double 它总是有小数点后跟大约六个零左右和末尾不是 0 的数字。其次,从数学库中可能看起来更糟,您可以从除法而不是小数位获得对数符号。
最后一点,Math 库直到它知道答案是什么,所以使用 double 类型是一种自动转换,无论您如何编写它以保证精度和数据类型的安全。 数据类型的自动交换称为提升(将精度提高为浮点数)或降级(将精度降低为浮点数)
并且要将其转换为整数,它会按照小数点后第一位的规则向上或向下舍入,因此您基本上只需要将答案放入“new Double(primativedoubletype)”对象中并使用它的“intValue”方法。
NB 将 (int) cast 放在它前面只能确保它在分配(通常从表达式或方法)到 int 变量时是一个 int,但是它不是提取另一个值的方法类型为 int,原始类型必须通过其标准 java 类型 class 对象及其 primatves 转换器方法进行转换。
int hostBits2 = new Double((double)Math.ceil(Math.log(hosts) / Math.log(2)+1e-10)).intValue();