Tag: 浮点

pow()似乎在这里出了一个

这里发生了什么: #include <stdio.h> #include <math.h> int main(void) { printf("17^12 = %lf\n", pow(17, 12)); printf("17^13 = %lf\n", pow(17, 13)); printf("17^14 = %lf\n", pow(17, 14)); } 我得到这个输出: 17^12 = 582622237229761.000000 17^13 = 9904578032905936.000000 17^14 = 168377826559400928.000000 13和14不匹配wolfram alpa cf: 12: 582622237229761.000000 582622237229761 13: 9904578032905936.000000 9904578032905937 14: 168377826559400928.000000 168377826559400929 而且,一些奇怪的部分并没有错,只有一个是错的! 如果这是我达到pow()可以为我做的极限,是否有一个替代scheme可以计算出来? 我需要一个可以计算x^y的函数,其中x^y总是小于ULLONG_MAX。

在二进制表示法中,小数点后面数字的含义是什么?

我有这个例子,如何从一个基地10号码转换为IEEE 754浮点表示 Number: 45.25 (base 10) = 101101.01 (base 2) Sign: 0 Normalized form N = 1.0110101 * 2^5 Exponent esp = 5 E = 5 + 127 = 132 (base 10) = 10000100 (base 2) IEEE 754: 0 10000100 01101010000000000000000 除了一段话,这对我来说是有意义的: 45.25 (base 10) = 101101.01 (base 2) 45是101101在二进制,这没关系,但他们是如何获得0.25为0.01?

存储统计数据,我需要DECIMAL,FLOAT还是DOUBLE?

我创造的乐趣,但我仍然要认真对待它,一个网站,主持各种testing。 我希望通过这些testing来收集统计数据。 一些数据将包括testing完成时间的百分比。 我可以很容易地计算出testing的百分比,但是我想要返回真实的数据,因为我在testing完成时存储了各种不同的值。 大多数值是在PHP浮动,所以我的问题是,如果我想要真正的统计数据,我应该将它们存储在MYSQL FLOAT,DOUBLE或DECIMAL。 我想利用MYSQL的function,如AVG()和LOG10()以及TRUNCATE() 。 为了让MYSQL返回基于我插入的值的真实数据,我应该使用什么作为数据库列的select。 我问,因为一些数字可能会或可能不是像10,10.89,99.09,或者简单的0浮点数。但是我想真实有效的统计数据被返回。 我能依靠浮点math吗? 编辑 我知道这是一个普遍的问题,我对此深表歉意,但对于像我这样的非math家,我也不是MYSQL的专家,我想请一个专家在这个领域的意见。 我已经做了研究,但是我仍然觉得我对这个问题的判断很混乱。 我再次道歉,如果我的问题是脱离主题或不适合本网站。

乘以1.0和int的精度浮点转换

假设条件(int)(i * 1.0f) == i对于任何整数i是否为真是安全的?

numpy float:在算术运算中比内build速度慢10倍?

下面的代码我正在得到非常奇怪的计时: import numpy as np s = 0 for i in range(10000000): s += np.float64(1) # replace with np.float32 and built-in float 内置浮动:4.9秒 float64:10.5 s float32:45.0 s 为什么float64比float更慢两倍? 为什么float32比float64慢5倍? 有没有办法避免使用np.float64的惩罚,并有numpy函数返回内置的float而不是float64 ? 我发现使用numpy.float64比Python的float慢得多,而numpy.float32甚至更慢(即使我在32位机器上)。 numpy.float32在我的32位机器上。 因此,每次我使用numpy.random.uniform等各种numpy函数,我将结果转换为float32 (以便进一步的操作将以32位精度执行)。 有什么办法可以在程序或命令行中设置一个单独的variables,并使所有numpy函数返回float32而不是float64 ? 编辑#1: numpy.float64比算术计算中的浮点数慢10倍 。 这是非常糟糕的,甚至转换为浮动和返回之前的计算使程序运行速度提高3倍。 为什么? 有什么我可以做的,以解决它? 我想强调,我的时间不是由于以下任何一种情况: 函数调用 numpy和python float之间的转换 对象的创build 我更新了代码,使问题更加清楚。 使用新的代码,使用numpy数据types看起来会使性能下降十倍: from datetime import datetime import […]

使用常数整数除法器进行高效的浮点除法

最近的一个问题 ,是不是允许编译器用浮点乘法来取代浮点运算,这就激励我提出这个问题。 在严格的要求下,代码转换后的结果应该与实际的除法运算按位相同,但对于二进制IEEE-754algorithm来说,对于二的幂因子是可能的。 只要除数的倒数是可以代表的,乘以除数的倒数即可得出与该除数相同的结果。 例如,乘以0.5可以代替2.0 。 然后人们想知道这样的replace是如何工作的,假设我们允许任何简短的指令序列来代替除法,但运行速度明显更快,同时提供相同的结果。 除了普通的乘法之外,还特别允许融合的乘加运算。 我在评论中指出了以下相关文章: Nicolas Brisebarre,Jean-Michel Muller和Saurabh Kumar Raina。 提前知道除数时加速正确舍入的浮点除法。 IEEE Transactions on Computers,Vol。 53,第8号,2004年8月,第1069-1072页。 本文作者所提倡的技术将计算除数y的倒数作为归一化的头尾对z h :z l如下: z h = 1 / y,z l = fma(-y,z h ,1 )/ y 。 之后,分割q = x / y然后被计算为q = fma(z h ,x,z l * x) 。 本文导出了除数y必须满足的各种条件才能使该algorithm正常工作。 正如人们容易观察到的那样,当头部和尾部的符号不同时,该algorithm存在无穷大和零的问题。 更重要的是,由于商尾zl * […]

在循环中使用“double”作为计数器variables

在我正在阅读的一本书中,有这样一段摘录: 您也可以使用浮点值作为循环计数器。 下面是一个用这种计数器for循环的例子: double a(0.3), b(2.5); for(double x = 0.0; x <= 2.0; x += 0.25) cout << "\n\tx = " << x << "\ta*x + b = " << a*x + b; 这个代码片段计算a*x+b值从0.0到2.0的a*x+b的值,步长为0.25 ; 但是,在循环中使用浮点计数器时需要小心。 许多十进制值不能完全用二进制浮点forms表示,所以差异可以累积起来。 这意味着你不应该编写一个for循环,这样循环的结束取决于一个浮点循环计数器达到一个精确值。 例如,以下devise不佳的循环永远不会结束: for(double x = 0.0 ; x != 1.0 ; x += 0.2) cout << x; 这个循环的意图是输出x的值,因为它从0.0变化到1.0 […]

双或浮动,这是更快?

我正在阅读“加速C ++”。 我发现一句话说“有时候执行速度比在C ++中执行速度快double ”。 读完这句话后,我对float和double工作感到困惑。 请向我解释这一点。

如何在C#中生成一个随机数字?

我想生成一个2值之间的随机浮点数。 什么是在C#中做到这一点的最好方法?

信号NaN的有用性?

我最近在IEEE 754和x87架构上读了很多。 我正在考虑在我正在使用的一些数字计算代码中使用NaN作为“缺失值”,并且我希望使用NaN 信号发送将允许我在不希望出现的情况下捕获浮点exception着手“缺失的价值”。 相反,我会用安静的 NaN让“缺失值”通过计算传播。 然而,信号NaN不能正常工作,因为我认为它们是基于存在于其上的非常有限的文档。 这里是我所知道的一个总结(所有这些使用x87和VC ++): _EM_INVALID(IEEE“无效”exception)在遇到NaN时控制x87的行为 如果_EM_INVALID被屏蔽(exception被禁用),则不会产生exception,操作可以返回安静的NaN。 涉及NaN信号的操作不会引发exception,但会被转换为安静的NaN。 如果_EM_INVALID未被屏蔽(例外启用),一个无效的操作(例如,sqrt(-1))会导致一个无效的exception被抛出。 x87 永远不会产生信号NaN。 如果_EM_INVALID未被屏蔽, 任何使用信号NaN(甚至用它初始化一个variables)都会导致一个无效的exception被抛出。 标准库提供了一种访问NaN值的方法: std::numeric_limits<double>::signaling_NaN(); 和 std::numeric_limits<double>::quiet_NaN(); 问题是我看不到任何信号NaN。 如果_EM_INVALID被屏蔽,则其行为与安静的NaN完全相同。 由于没有NaN与任何其他NaN相比,没有逻辑差异。 如果_EM_INVALID 没有被屏蔽(exception被启用),那么甚至不能用信号发送一个variablesNaN: double dVal = std::numeric_limits<double>::signaling_NaN(); 因为这会引发一个exception(信号NaN值被加载到一个x87寄存器中以将其存储到存储器地址中)。 你可能会像我这样想: 掩码_EM_INVALID。 用信号NaN初始化variables。 Unmask_EM_INVALID。 但是,步骤2会导致信号NaN转换为安静的NaN,所以后续使用它不会引发exception! 那么WTF? 信号NaN有没有用处或目的? 我明白其中一个原意是用它初始化内存,以便可以捕获到单位浮点值的使用。 有人可以告诉我,如果我在这里失去了一些东西? 编辑: 为了进一步说明我希望做的事情,下面是一个例子: 考虑对数据向量执行math运算(双精度)。 对于某些操作,我想允许向量包含一个“缺失值”(假设这对应于一个电子表格列,例如,其中一些单元格没有值,但它们的存在是显着的)。 对于某些操作,我不想让vector包含“缺失值”。 也许我想采取一个不同的行动方式,如果一个“缺失的价值”是存在的设置 – 也许执行一个不同的操作(因此这不是一个无效的状态)。 这个原始代码看起来像这样: const double MISSING_VALUE = 1.3579246e123; using […]