我试图检查哪里float
失去了精确表示大整数的能力。所以我写了这个小片段:
int main() {
for (int i=0; ; i++) {
if ((float)i!=i) {
return i;
}
}
}
Run Code Online (Sandbox Code Playgroud)
该代码似乎适用于所有编译器,但不包括clang。Clang生成一个简单的无限循环。上帝保佑。
可以吗?如果是,那是QoI问题吗?
我正在摆弄无限循环来测试其他代码/我的理解,并遇到了这种奇怪的行为.在下面的程序中,从0到2 ^ 24的计数在我的机器上花费<100ms,但是计数到2 ^ 25需要更多的时间(在写入时,它仍在执行).
为什么会这样?
这是在Windows 1.8的64位副本上的Java 1.8.0_101下.
TestClass.java
public class TestClass {
public static void main(String[] args) {
addFloats((float) Math.pow(2.0, 24.0));
addFloats((float) Math.pow(2.0, 25.0));
}
private static void addFloats(float number) {
float f = 0.0f;
long startTime = System.currentTimeMillis();
while(true) {
f += 1.0f;
if (f >= number) {
System.out.println(f);
System.out.println(number + " took " + (System.currentTimeMillis() - startTime) + " msecs");
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我试图更好地理解浮点运算,并且已经看到了"每个计算机科学家应该知道浮点算术的内容"的一些链接.
我还是不明白,一些怎么样0.1
或0.5
存储在花车和小数.
有人可以解释它是如何布局的记忆?
我知道浮子是两部分(即一个数字的东西).
我无法理解为什么有些数字不能用浮点数表示.
我们知道,普通浮点数会有符号位,指数和尾数.例如,为什么不能在这个系统中准确地表示0.1; 我想到的方式是你将10(1010 in bin)放到尾数,-2放到exponent.据我所知,这两个数字都可以在尾数和指数中准确表示.那么为什么我们不能准确地代表0.1?
我有一个大的DataFrame(大约4e + 07行)。
求和时,无论在列选择之前还是之后进行求和,我都会得到2个明显不同的结果。
另外,即使总数都在2 ** 31以下,类型也会从float32变为float64
df[[col1, col2, col3]].sum()
Out[1]:
col1 9.36e+07
col2 1.39e+09
col3 6.37e+08
dtype: float32
df.sum()[[col1, col2, col3]]
Out[2]:
col1 1.21e+08
col2 1.70e+09
col3 7.32e+08
dtype: float64
Run Code Online (Sandbox Code Playgroud)
我显然缺少了什么,有人遇到过同样的问题吗?
谢谢你的帮助。
我一直在比较 Intrinsics 向量缩减、朴素向量缩减和使用 openmp 编译指示的向量缩减的运行时间。然而,我发现这些场景的结果是不同的。代码如下 - (内在向量归约取自 - Fastest way to dohorizontal SSE vector sum(或其他归约))
#include <iostream>
#include <chrono>
#include <vector>
#include <numeric>
#include <algorithm>
#include <immintrin.h>
inline float hsum_ps_sse3(__m128 v) {
__m128 shuf = _mm_movehdup_ps(v); // broadcast elements 3,1 to 2,0
__m128 sums = _mm_add_ps(v, shuf);
shuf = _mm_movehl_ps(shuf, sums); // high half -> low half
sums = _mm_add_ss(sums, shuf);
return _mm_cvtss_f32(sums);
}
float hsum256_ps_avx(__m256 v) {
__m128 vlow = _mm256_castps256_ps128(v);
__m128 vhigh = _mm256_extractf128_ps(v, 1); // high …
Run Code Online (Sandbox Code Playgroud)