Tag: 浮点

生成一个0到1之间的随机数

我试图产生一个介于0和1之间的随机数。我一直在阅读关于arc4random() ,但没有任何关于从它获得一个浮点数的信息。 我该怎么做呢?

硬浮点数和软浮点数有什么区别?

当我用我的交叉工具链编译C代码时,链接器打印警告的页面,说我的可执行文件使用硬浮动,但我的libc使用软浮动。 有什么不同?

什么是1.0最接近的两倍,那不是1.0?

有没有一种方法来编程获得最接近1.0,但实际上不是1.0的双? 一个不好的方法就是把double加memcpy到一个相同大小的整数,然后减去一个。 IEEE754浮点格式的工作方式是,将小数部分从全零(1.000000000000)改为全1(1.111111111111),指数减1。 但是,存在整数以小端存储,而浮点以大端存储的机器,所以并不总是工作。

浮点与现代硬件上的整数计算

我正在用C ++做一些关键性能的工作,而且我们目前正在使用整数计算来处理本质上浮点的问题,因为“更快”。 这导致了很多烦人的问题,并增加了很多令人讨厌的代码。 现在,我记得大约读了386天的浮点计算如此慢,我相信(IIRC)有一个可选的共同进程。 但是现在肯定有更复杂和更强大的CPU,如果进行浮点或整数计算,“速度”没有什么区别? 特别是由于实际的计算时间相对于导致pipe道失速或从主存储器中取出某些东西而言是微小的。 我知道正确的答案是在目标硬件上进行基准testing,那么testing它的好方法是什么? 我写了两个微小的C ++程序,并将它们的运行时间与Linux上的“time”进行了比较,但是实际运行时间太可变(不能帮助我在虚拟服务器上运行)。 没有花费我的整个一天运行数百个基准,制作图表等是否有我可以做的,以获得合理的相对速度testing? 任何想法或想法? 我完全错了吗? 我使用的程序如下,它们在任何方面都不相同: #include <iostream> #include <cmath> #include <cstdlib> #include <time.h> int main( int argc, char** argv ) { int accum = 0; srand( time( NULL ) ); for( unsigned int i = 0; i < 100000000; ++i ) { accum += rand( ) % […]

单精度和双精度浮点运算有什么区别?

单精度浮点运算和双精度浮点运算有什么区别? 我特别感兴趣的是有关video游戏机的实用术语。 例如,任天堂64有一个64位的处理器,如果这样做,那么这是否意味着它能够进行双精度浮点运算? PS3和Xbox 360能否实现双精度浮点运算或单精度浮点运算,并且一般使用的是双精度能力(如果存在的话)。

在C ++中实现长方程时,如何通过高级方法提高性能?

我正在开发一些工程模拟。 这涉及到实施一些长方程,如这个方程来计算橡胶材料的应力: T = ( mu * ( pow(l1 * pow(l1 * l2 * l3, -0.1e1 / 0.3e1), a) * a * ( pow(l1 * l2 * l3, -0.1e1 / 0.3e1) – l1 * l2 * l3 * pow(l1 * l2 * l3, -0.4e1 / 0.3e1) / 0.3e1 ) * pow(l1 * l2 * l3, […]

gcc的快速math实际上做了什么?

我明白–ffast-math标志可以大大提高浮动操作的速度,并超出IEEE标准,但我似乎无法find真正发生的事情的信息。 任何人都可以请解释一些细节,也许给一个明确的例子,如果国旗是打开或closures如何将改变? 我也尝试过类似的问题,但是找不到任何解释ffastmath运作的东西。

0.1浮点数大于0.1的两倍。 我预料它是错误的

让: double d = 0.1; float f = 0.1; 应该expression (f > d) 返回true或false ? 经验上,答案是true 。 但是,我认为这是false 。 由于0.1不能完全以二进制表示,而double有15至16位的精度,浮点数只有7 。 所以他们都小于0.1 ,而双倍更接近0.1 。 我需要一个确切的解释。

为什么Clang会优化x * 1.0而不是x + 0.0?

为什么铿锵优化了这个代码中的循环 #include <time.h> #include <stdio.h> static size_t const N = 1 << 27; static double arr[N] = { /* initialize to zero */ }; int main() { clock_t const start = clock(); for (int i = 0; i < N; ++i) { arr[i] *= 1.0; } printf("%u ms\n", (unsigned)(clock() – start) * 1000 / CLOCKS_PER_SEC); […]

是否有可能通过减去两个不相等的浮点数来得到0?

在下面的例子中是否有可能被0(或者无穷)分割? public double calculation(double a, double b) { if (a == b) { return 0; } else { return 2 / (a – b); } } 在正常情况下,当然不会。 但是如果a和b非常接近,由于计算精度会导致(ab)为0 ? 请注意,这个问题是针对Java的,但我认为它将适用于大多数编程语言。