Questions tagged «floating-point»

浮点数是实数的近似值,可以表示比整数大的范围,但使用相同的内存量,但代价是精度较低。如果您的问题是关于较小的算术错误(例如,为什么0.2 + 0.1等于0.300000001?)或十进制转换错误,请在发布前阅读下面链接的“信息”页面。



1
将双精度整数舍入为32位int的快速方法
在阅读Lua的源代码时,我注意到Lua使用a将a macro舍double入为32位int。我提取了macro,它看起来像这样: union i_cast {double d; int i[2]}; #define double2int(i, d, t) \ {volatile union i_cast u; u.d = (d) + 6755399441055744.0; \ (i) = (t)u.i[ENDIANLOC];} 这里ENDIANLOC定义为endianness,0对于小端,1对于大端。Lua会小心处理字节顺序。t代表整数类型,例如int或unsigned int。 我做了一些研究,有一个更简单的格式macro使用了相同的想法: #define double2int(i, d) \ {double t = ((d) + 6755399441055744.0); i = *((int *)(&t));} 或采用C ++样式: inline int double2int(double d) { …

11
单精度和双精度浮点运算之间有什么区别?
单精度浮点运算和双精度浮点运算之间有什么区别? 我对与视频游戏机相关的实用术语特别感兴趣。例如,Nintendo 64是否具有64位处理器,如果可以,这是否意味着它能够进行双精度浮点运算?PS3和Xbox 360可以执行双精度浮点运算还是仅执行单精度运算?通常使用双精度功能吗(如果存在的话)?


2
IEEE 754浮点数不能准确表示的第一个整数是哪个?
为了清楚起见,如果我使用的是实现IEE 754浮点数的语言,则我声明: float f0 = 0.f; float f1 = 1.f; ...然后将它们打印出来,我将得到0.0000和1.0000-准确。 但是,IEEE 754不能表示真实数字中的所有数字。接近零,“间隙”很小;随着距离的增加,差距会越来越大。 因此,我的问题是:对于IEEE 754浮点数,它是无法精确表示的第一个(最接近零)整数吗?我现在只真正关心32位浮点数,尽管如果有人给我64位的答案,我将很感兴趣! 我认为这很简单,只需计算2个bits_of_mantissa并加1,其中bits_of_mantissa是标准公开的位数。我是在我的机器(MSVC ++,Win64)上针对32位浮点数执行此操作的,但看起来还不错。

5
从Python熊猫聚合结果格式化/抑制科学计数法
如何对熊猫的groupby运算输出的格式进行修改,从而产生大量的科学计数法? 我知道如何在python中进行字符串格式化,但是在这里应用它时我很茫然。 df1.groupby('dept')['data1'].sum() dept value1 1.192433e+08 value2 1.293066e+08 value3 1.077142e+08 如果我转换为字符串,这会抑制科学计数法,但是现在我只是想知道如何设置字符串格式并添加小数。 sum_sales_dept.astype(str)

4
为什么4 * 0.1的浮点值在Python 3中看起来不错,但3 * 0.1却不这样?
我知道大多数小数都没有确切的浮点表示形式(浮点数学运算符是否损坏?)。 但是,当两个值实际上都具有丑陋的十进制表示形式时,我看不出为什么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')

6
为什么Double.MIN_VALUE不是负数
任何人都可以阐明为什么Double.MIN_VALUEDoubles实际不能使用的最小值吗?它是一个正值,而Double可以当然是负值。 我理解为什么它是一个有用的数字,但它似乎是一个非常不直观的名称,尤其是与相比Integer.MIN_VALUE。调用它Double.SMALLEST_POSITIVE或MIN_INCREMENT类似名称将具有更清晰的语义。 另外,Doubles可以取的最小值是多少?是-Double.MAX_VALUE吗 该文档似乎没有说。

16
比较php中的浮动
我想比较PHP中的两个浮点数,如以下示例代码所示: $a = 0.17; $b = 1 - 0.83; //0.17 if($a == $b ){ echo 'a and b are same'; } else { echo 'a and b are not same'; } 在此代码中,即使和相同,它也返回else条件的结果而不是if条件。有没有什么特殊的方法来处理/比较PHP中的浮点数?$a$b 如果是,请帮助我解决此问题。 还是我的服务器配置有问题?

17
如何在Bash中比较两个浮点数?
我正在努力比较bash脚本中的两个浮点数。我必须要变量,例如 let num1=3.17648e-22 let num2=1.5 现在,我只想对这两个数字进行简单比较: st=`echo "$num1 < $num2" | bc` if [ $st -eq 1]; then echo -e "$num1 < $num2" else echo -e "$num1 >= $num2" fi 不幸的是,我对num1的正确处理存在一些问题,它可以是“电子格式”。:( 任何帮助,欢迎提示!

9
为什么Double.NaN == Double.NaN返回false?
我刚刚研究OCPJP问题,发现了这个奇怪的代码: public static void main(String a[]) { System.out.println(Double.NaN==Double.NaN); System.out.println(Double.NaN!=Double.NaN); } 运行代码时,我得到: false true false当我们比较看起来彼此相同的两件事时,输出如何?什么NaN意思
155 java  floating-point  nan  scjp  ocpjp 

10
C#中的浮点数学是否一致?是真的吗?
不,这不是另一个“为什么(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位)。 始终以相同的优化设置运行相同的编译器,并要求所有用户具有相同的CPU架构(禁止跨平台使用)。因为我的“编译器”实际上是JIT,所以每次运行程序时它的优化方式都可能不同,所以我认为这是不可能的。 使用定点算法,float并double完全避免。decimal可以用于此目的,但是会慢很多,并且没有System.Math库函数支持它。 那么,这甚至在C#中是一个问题吗? 如果我仅打算支持Windows(不支持Mono)怎么办? 如果是,是否有任何方法可以强制我的程序以正常的双精度运行? 如果没有,是否有任何库可以帮助保持浮点计算的一致性?

7
浮点数与双精度
代码 float x = 3.141592653589793238; double z = 3.141592653589793238; printf("x=%f\n", x); printf("z=%f\n", z); printf("x=%20.18f\n", x); printf("z=%20.18f\n", z); 会给你输出 x=3.141593 z=3.141593 x=3.141592741012573242 z=3.141592653589793116 输出的第三行741012573242是垃圾,第四行116是垃圾。双打是否总是有16个有效数字,浮子总是有7个有效数字?为什么双打没有14位有效数字?
155 c  floating-point 

3
为什么多次添加0.1仍然无损?
我知道0.1十进制数不能用有限的二进制数精确地表示(解释),因此double n = 0.1将失去一些精度,并且将不精确0.1。另一方面,0.5因为它确实可以表示0.5 = 1/2 = 0.1b。 话虽如此,将0.1 三遍相加并不完全是可以理解的,0.3因此,以下代码将输出false: double sum = 0, d = 0.1; for (int i = 0; i < 3; i++) sum += d; System.out.println(sum == 0.3); // Prints false, OK 但是,0.1 五次相加会得到确切的结果0.5呢?以下代码显示true: double sum = 0, d = 0.1; for (int i = 0; …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.