我有一个双变量
public double votes(){
double votexp = 0;
for(Elettore e:docenti.values()){
if(e.getVoto()==true) //everytime this is true increment by 1
{
votexp+=1.0;
}
}
for(Elettore e:studenti.values()){
if(e.getVoto()==true) //everytime this is true increment by 0.2
{
votexp+=0.2;
}
}
for(Elettore e:pta.values()){
if(e.getVoto()==true) //everytime this is true increment by 0.2
{
votexp+=0.2;
}
}
return votexp;
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下,变量应该增加到2.6但是votexp返回2.6000000000000005我如何通过使用相同的双变量并返回双精度数来解决这个问题?
将数字从双精度浮点格式转换为单精度浮点格式会导致精度损失.用于实现此转换的算法是什么?
数字是大于3.4028234e+38还是小于-3.4028234e+38简单地减少到各自的限制?我觉得转换过程比这更复杂,但我找不到它的文档.
floating-point type-conversion double-precision ieee-754 single-precision
我试图理解Matlab中的双精度数.为什么这个1 - 3*(4/3 - 1)不等于零?
floating-point matlab floating-accuracy double-precision ieee-754
以下程序的输出应该是什么?
#include <stdio.h>
#include <math.h>
#include <float.h>
int main() {
int exp;
float mant = frexp(FLT_MAX, &exp);
printf("frexp(%a) = {%f, %d}\n", FLT_MAX, mant, exp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的amd64 Linux系统上使用glibc打印:
frexp(0x1.fffffep+127) = {1.000000, 128}
Run Code Online (Sandbox Code Playgroud)
从IEEE 754维基百科文章中我看到"最大规范化数字"的指数为127.我还看到指数为128的唯一值是±Infinity和NaN.
从frexp手册页我明白frexp()应返回[0.5,1.0]范围内的值(即不包括1.0).
基于这些信息,尾数和指数返回似乎都是不正确的.
知道frexp()的作用和FLT_MAX的值(=(2 - 2 ^ -23)*2 ^ 127)告诉我{1.0,128}确实非常接近正确答案,因为(2 - 2 ^ - 23)非常接近2.
那么frexp(FLT_MAX,...)应该返回什么?
给定64位代表IEEE 754双精度格式的数字,将它们转换为32位的算法是什么,它们代表相同的数字,但是采用IEEE 754单精度格式(可能会丢失精度)?
此外,有没有一种简单的方法在Ada中执行此转换,而无需操作位?
划分两个IEEE 754浮点数的最安全的方法是什么?
就我而言,语言是JavaScript,但我想这并不重要.目标是避免正常的浮点陷阱.
我已经读过,人们可以使用"修正系数"(cf)(例如10提升到某个数字,例如10 ^ 10),如下所示:
(a * cf) / (b * cf)
Run Code Online (Sandbox Code Playgroud)
但我不确定这会对分裂产生影响吗?
顺便说一下,我已经看过Stack Overflow上的其他浮点帖子了,我还没有找到关于如何划分两个浮点数的单一帖子.如果答案是在添加和分割时解决浮点问题的解决方案之间没有区别,那么请回答一下.
编辑:
我在评论中已经被问到我所指的哪些陷阱,所以我想我也会在这里为那些没有阅读评论的人添加快速说明:
当加0.1和0.2时,你会得到0.3,但是使用浮点运算得到0.30000000000000004(至少在JavaScript中).这只是常见陷阱的一个例子.
上面的问题在Stack Overflow上讨论了很多次,但我不知道分割时会发生什么,如果它与添加或乘法时发现的陷阱不同.可能没有风险,在这种情况下,这将是一个非常好的答案.
我一直在努力将标准普尔500指数的价值(现在是1864.78)转换为它在内存中以IEEE单精度格式表示的价值.
转换小数点左边(1864)很容易.
11101001000.
但是如何获得十进制的二进制表示(.78)?我尝试使用该技术但它在8位指数IEEE格式上产生了许多数字:
.78*2 = 1.56 1
.56*2 = 1.12 1
.12*2 = .24 0
.24*2 = .48 0
.48*2 = .96 0
.96*2 = 1.92 1
.92*2 = 1.84 1
.84*2 = 1.68 1
.68*2 = 1.36 1
.36*2 = .72 0
.72*2 = 1.44 1
.44*2 = .88 1(向上舍入,因为现在我们总共有23位)
11101001000.110001111011 =尾数23位
添加0表示符号
0 11101001000.110001111011
现在我需要将小数移动10个以上
1.1101001000110001111011 x 2 ^ 10指数现在是10
添加0位以使全尾数为23位
1.11010010001100011110110
指数是10所以10 + 127 = 137
等于10001001
所以0 10001001 11010010001100011110110是32位数.
这看起来像是一个体面的方法吗?我测试了这个值并写下了这个问题,我实际上可以自己完成它.
用这个测试十进制FP. http://www.h-schmidt.net/FloatConverter/IEEE754.html
double可以表示float可以表示的每个值.
将浮点数转换为double只是通过加0来扩展尾数,并通过填充符号位来扩展指数部分吗?
我在http://www.binaryconvert.com/index.html上测试了一些数据.它以这种方式工作.但我没有找到转换的任何官方定义.转换是否有任何角落不能以这种方式工作?
我有这个代码用于获取IEEE二进制数的尾数或值.
iFloat_t floatGetVal (iFloat_t x) {
iFloat_t mantissa = (BITS == 16) ? (x & 0x03FF)
: (x & 0x007FFFFF);
debug("%s: getVal before implicit 1", getBinary(mantissa));
//mantissa = (BITS == 16) ? (mantissa | 0x04)
// : (mantissa | 0x008);
mantissa = x | 0000010000000000;
debug("%s: getVal after implicit 1", getBinary(mantissa));
mantissa = (BITS == 16) ? (mantissa & 0x07FF)
: (mantissa & 0x00FFFFFF);
if(floatGetSign(x) == 1) {
mantissa = ~mantissa + 1;
}
return mantissa;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是当我尝试从数字63.125获取值时,这是相应的输出:
DEBUG iFloat.c[31] …Run Code Online (Sandbox Code Playgroud) 这是一个非常简单的问题,但需要专家回答。
我们知道,在浮点低于正常,我们摆脱掉的差距2^emin和0。
通过半圆整(RTE)模式,我们应将无限精度结果四舍五入为(0.1111...1|r)*2^emin或(1.1111...1|r')*2^(emin-1)?该点左侧的数字是隐式位。
对于第一种情况:
在论文中,每个计算机科学家都应该了解浮点算术数值计算的知识,在图2中,我看到其左侧2^emin的空间与右侧的空间相同。因此,直接地,左边数字的数值是2^emin - 2^(1-p)(p=24在flp32中)。如果我们进行RTE舍入,似乎我们应该使用24bit有效位之后的位作为舍入位(即(0.111_1111_1111_1111_1111_1111|r)*2^emin,请参见
--|---+---+....+-?-|---+---+....+---|-------+........
--0---------------2^emin---------2^emin+1
Run Code Online (Sandbox Code Playgroud)
我?在轴上使用问号()表示半点
对于第二种情况:在IEEE标准中,对于次正规检测,在四舍五入之前说“无界”指数blabla。因此,如果我们可以具有无穷大的指数,则可以将精确结果移到(1.1111...1|r')*2^(emin-1)。在这种情况下,我们在上保留了一半的左空间2^emin。这与上的所有其他相邻空格相似2^e,但是一旦在轴上接近0,空格的数量将变为无限。看到
--|...++++|-+-+-+...|---+---+....+-?-|-------+........
--0-....----------2^emin-1----------2^emin
------| here is keep shrinking
Run Code Online (Sandbox Code Playgroud)
在这种情况下,似乎我们应该将精确结果四舍五入为
(1.111_1111_1111_1111_1111_1111|r')*2^(emin-1)
Run Code Online (Sandbox Code Playgroud)
通过将情况1的结果左移1位,表示保护位在这种情况下很有用。
在这两种情况下,我们具有不同的舍入位,因此可能会得到不同的结果。我们应该遵循哪种情况?我看不到任何有关此主题的文档/论文。