我试图找到一个最大的立方根,它是一个整数,小于12,000.
processing = True
n = 12000
while processing:
n -= 1
if n ** (1/3) == #checks to see if this has decimals or not
Run Code Online (Sandbox Code Playgroud)
我不知道怎么检查它是否是一个整数但是!我可以将它转换为字符串然后使用索引来检查结束值并查看它们是否为零,但这似乎相当麻烦.有更简单的方法吗?
我知道使用==检查浮点变量的相等性不是一个好方法。但我只想通过以下陈述来了解这一点:
float x = ...
float y = x;
assert(y == x)
Run Code Online (Sandbox Code Playgroud)
既然y是从 复制的x,那么这个断言是真的吗?
如何格式化浮点数,使其不包含剩余的零?换句话说,我希望得到的字符串尽可能短..?
喜欢:
3 -> "3"
3. -> "3"
3.0 -> "3"
3.1 -> "3.1"
3.14 -> "3.14"
3.140 -> "3.14"
Run Code Online (Sandbox Code Playgroud) 我只是在研究OCPJP问题,我发现了这个奇怪的代码:
public static void main(String a[]) {
System.out.println(Double.NaN==Double.NaN);
System.out.println(Double.NaN!=Double.NaN);
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我得到了:
false
true
Run Code Online (Sandbox Code Playgroud)
false当我们比较两个看起来彼此相同的东西时,输出结果如何?什么NaN意思?
我知道大多数小数都没有精确的浮点表示(浮点数学是否被破坏?).
但我不明白为什么4*0.1打印得很好0.4,但3*0.1不是,当两个值实际上都有丑陋的十进制表示时:
>>> 3*0.1
0.30000000000000004
>>> 4*0.1
0.4
>>> from decimal import Decimal
>>> Decimal(3*0.1)
Decimal('0.3000000000000000444089209850062616169452667236328125')
>>> Decimal(4*0.1)
Decimal('0.40000000000000002220446049250313080847263336181640625')
Run Code Online (Sandbox Code Playgroud) 为清楚起见,如果我使用的是实现IEE 754浮点数的语言,我声明:
float f0 = 0.f;
float f1 = 1.f;
Run Code Online (Sandbox Code Playgroud)
...然后将它们打印出来,我会得到0.0000和1.0000 - 完全正确.
但IEEE 754无法表示实线上的所有数字.接近于零,"差距"很小; 当你越走越远时,差距越来越大.
所以,我的问题是:对于一个IEEE 754浮点数,这是第一个(最接近零)整数,无法准确表示?我现在只关心32位浮点数,虽然如果有人给出它我会有兴趣听到64位的答案!
我认为这就像计算2 bits_of_mantissa并添加1 一样简单,其中bits_of_mantissa是标准公开的位数.我在我的机器(MSVC++,Win64)上为32位浮点数做了这个,但它看起来很好.
不,这不是另一个"为什么是(1/3.0)*3!= 1"的问题.
我最近一直在读关于漂浮点的事情; 具体而言,相同的计算如何在不同的体系结构或优化设置上给出不同的结果.
对于存储重放的视频游戏来说,这是一个问题,或者是对等网络(而不是服务器 - 客户端),它依赖于每次运行程序时产生完全相同结果的所有客户端 - 一个小的差异浮点计算可能导致不同机器(甚至是同一台机器上)的游戏状态截然不同!
甚至在"跟随" IEEE-754的处理器中也会发生这种情况,这主要是因为某些处理器(即x86)使用双倍扩展精度.也就是说,它们使用80位寄存器进行所有计算,然后截断为64位或32位,导致与使用64位或32位进行计算的机器不同的舍入结果.
我在网上看到过这个问题的几种解决方案,但都是针对C++,而不是C#:
double使用_controlfp_s(Windows),_FPU_SETCW(Linux?)或fpsetprec(BSD)禁用双扩展精度模式(以便所有计算使用IEEE-754 64位).float和double完全.decimal可以用于此目的,但会慢得多,并且没有任何System.Math库函数支持它.那么,这在C#中是否也是一个问题? 如果我只打算支持Windows(而不是Mono)怎么办?
如果是,有没有办法强制我的程序以正常的双精度运行?
如果没有,是否有任何库可以帮助保持浮点计算的一致性?
单精度浮点运算和双精度浮点运算有什么区别?
我对与视频游戏机有关的实用术语特别感兴趣.例如,Nintendo 64是否具有64位处理器,如果确实如此,则意味着它能够进行双精度浮点运算?PS3和Xbox 360能否实现双精度浮点运算或单精度运算,一般情况下使用双精度功能(如果存在?).
任何人都可以解释为什么Double.MIN_VALUE实际上不是双打可以采取的最小值?这是一个正值,Double可以是负面的.
我明白为什么它是一个有用的数字,但它似乎是一个非常不直观的名称,特别是与之相比时Integer.MIN_VALUE.调用它Double.SMALLEST_POSITIVE或MIN_INCREMENT类似语句会有更清晰的语义.
此外,双打可以采取的最低价值是多少?是-Double.MAX_VALUE吗?文档似乎没有说.
floating-point ×10
ieee-754 ×3
python ×3
java ×2
precision ×2
rounding ×2
.net ×1
c# ×1
c++ ×1
formatting ×1
nan ×1
numbers ×1
ocpjp ×1
operations ×1
perl ×1
pretty-print ×1
processor ×1
scjp ×1
types ×1