这个问题是由于我在进一步调查这个问题之后发现的一些奇怪的东西而产生的。 我总是把MATLABvariables理解为默认的双精度 。 所以,如果我要做一些小数点后面20位数的variables声明: >> num = 2.71828182845904553488; >> class(num) %# Display the variable type ans = double 我期望最后4位数字被忽略,因为浮点相对精度在10-16的数量级 : >> eps(num) ans = 4.440892098500626e-016 如果我试图显示小数点后16位以上的数字(使用FPRINTF或SPRINTF ),我得到我期望看到的: >> fprintf('%0.20f\n',num) 2.71828182845904550000 >> sprintf('%0.20f',num) ans = 2.71828182845904550000 换句话说,数字17到20都是0。 但是当我把符号工具箱中的variables精度算术函数传递给num时,事情变得很奇怪,告诉它用21位数的精度来表示数字: >> vpa(num,21) ans = 2.71828182845904553488 什么?! 最后4位数字再次出现! 当我input的原始数字被存储为双精度variablesnum时,不应该丢失它们吗? 既然num是一个双精度variables,当它传递给vpa , vpa是如何知道它们是什么? 我最好的猜测是,MATLAB在内部用比double更高的精度代表num ,因为我把它初始化为一个数字,比double-precisionvariables可以处理的小数点还多。 这究竟是发生了什么,还是其他的事情呢? 奖金:如果你还没有从上面的偏头痛,这是另一个混乱的来源… >> num = […]
我有一些类似于Current Level: 13.4 db.的stringCurrent Level: 13.4 db. 我只想提取浮点数。 我说浮动,而不是小数,因为它有时是整体。 RegEx能做到这一点,还是有更好的办法?
当允许使用的唯一的浮点指令是387时,几乎不可能(*)以合理的成本提供严格的IEEE 754语义。 当希望保持FPU工作在完整的64位有效位上时,这是特别困难的,所以long double精度型可用于扩展精度。 通常的“解决scheme”是以唯一可用的精度进行中间计算,并在或多或less明确定义的情况下将其转换为较低的精度。 最近的GCC版本根据Joseph S. Myers在2008年发布的GCC邮件列表中的解释,处理了中间计算中的超额精度。 就我所知,这个描述使得一个程序编译成gcc -std=c99 -mno-sse2 -mfpmath=387完全可以预测的。 如果偶然的话,它不是,这是一个错误,它将是固定的:Joseph S. Myers在他的文章中表示的意图是使其可预测。 是否logging了Clang如何处理过度的精度(比如使用选项-mno-sse2 )以及在哪里? (*)编辑:这是一个夸张。 当允许将x87 FPUconfiguration为使用53位有效位时,它会稍微令人烦恼,但是仿真二进制64 并不困难 。 在下面的R ..的评论之后,下面是我和Clang最近版本的简短交互的日志: Hexa:~ $ clang -v Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn) Target: x86_64-apple-darwin12.4.0 Thread model: posix Hexa:~ $ cat fem.c #include <stdio.h> #include <math.h> #include <float.h> #include <fenv.h> double […]
我正在阅读Java语言规范中的浮点型NaN值(我很无聊)。 一个32位float有以下格式: seee eeee emmm mmmm mmmm mmmm mmmm mmmm s是符号位, e是指数位, m是尾数位。 NaN值被编码为全1的指数,并且尾数位不全是0(这将是+/-无穷大)。 这意味着有许多不同的可能的NaN值(具有不同的s和m位值)。 对此, JLS§4.2.3说: IEEE 754为其单个和双个浮点格式中的每一个都允许多个不同的NaN值。 当生成新的NaN时,每个硬件体系结构为NaN返回一个特定的位模式,程序员也可以创build具有不同位模式的NaN,以编码例如回顾性诊断信息。 JLS中的文本似乎意味着例如0.0/0.0的结果具有依赖于硬件的位模式,并且取决于该expression式是否被计算为编译时间常数,它所依赖的硬件可能是Java程序编译的硬件或程序运行的硬件。 如果这是真的,这一切似乎非常片断。 我跑了下面的testing: System.out.println(Integer.toHexString(Float.floatToRawIntBits(0.0f/0.0f))); System.out.println(Integer.toHexString(Float.floatToRawIntBits(Float.NaN))); System.out.println(Long.toHexString(Double.doubleToRawLongBits(0.0d/0.0d))); System.out.println(Long.toHexString(Double.doubleToRawLongBits(Double.NaN))); 我的机器上的输出是: 7fc00000 7fc00000 7ff8000000000000 7ff8000000000000 输出结果没有显示出预期的结果。 指数位全部为1.尾数的高位也是1,对于NaN,这显然表示“安静的NaN”,而不是“信号NaN”( https://en.wikipedia.org/wiki/NaN# Floating_point )。 符号位和尾数位的其余部分都是0.输出还显示在我的机器上生成的NaN与来自Float和Double类的常量NaN之间没有差别。 我的问题是, 无论编译器或虚拟机的CPU如何,Java的输出是否保证 ,还是真的不可预测? JLS对此很神秘。 如果输出保证为0.0/0.0 ,是否有任何生成NaN的算术方法,其他(可能是硬件相关的)位模式? (我知道intBitsToFloat / longBitsToDouble可以编码其他的NaN,但我想知道如果其他值可以发生在正常的算术)。 后续要点:我注意到, Float.NaN和Double.NaN指定了它们的确切位模式,但是在源代码( 浮点 , 双 精度 )中,它们是由0.0/0.0生成的。 如果这种划分的结果真的取决于编译器的硬件,那么规范或实现似乎就有缺陷。
我不知道为什么在Java或其他语言的float值之后放置f或者F? 例如, float fVariable = 12.3f; 除了表明这是一个浮点值以外的任何特性?
我正在写一个应用程序读取大型浮点数组,并执行一些简单的操作。 我使用花车,因为我认为它会比双打快,但经过一些研究后,我发现这个话题有些混乱。 任何人都可以详细说明这一点?
为什么无限比较遵循适用于NaN的逻辑? 此代码打印出三次false : double a = Double.NaN; double b = Double.NaN; System.out.println(a == b); // false System.out.println(a < b); // false System.out.println(a > b); // false 但是,如果将Double.NaN更改为Double.POSITIVE_INFINITY ,则对于等于或小于比较,我会得到相等的结果: double a = Double.POSITIVE_INFINITY; double b = Double.POSITIVE_INFINITY; System.out.println(a == b); // true System.out.println(a < b); // false System.out.println(a > b); // false 这似乎很危险。 假设无限值是由溢出产生的,那么我认为在完美算术中,两个以infinities结尾的variables实际上是不相等的。
可能重复: round()用于C ++中的float 我有一个double(称为x),意思是55,但实际上存储为54.999999999999943157,我刚刚意识到。 所以当我这样做 double x = 54.999999999999943157; int y = (int) x; y = 54而不是55! 这让我困惑了很久。 我如何才能正确回合?
我们有几个不同的开发者贡献的一些iOS应用程序。 我仍然注意到的一个问题是,我们的故事板中的视图将从其被放置或resize的位置移出,以使它们更小,当标签全部是一个标签时,突然间正在截断他们的文字。 我注意到,当开发人员没有直接对故事板进行任何编辑时,我们的视图的这些降级出现在我们的Git存储库的提交中。 他们可能已经在界面生成器中查看了故事板,但是并没有对故事板做任何真正的改变。 尽pipe如此,这些改变还是被保存下来,并与他们正在进行的工作一起承诺。 当我在负责任的提交之前和之后的故事板文件之间进行文本比较的时候,我看到了很小的变化来查看框架,比如: <rect key="frame" x="203" y="8" width="362" height="29"/> | V <rect key="frame" x="203" y="7.5" width="362" height="29"/> 和 <rect key="frame" x="446.00000170260091" y="7" width="302" height="30"/> | V <rect key="frame" x="446" y="7" width="302" height="30"/> 和 <rect key="frame" x="364" y="3" width="200" height="38"/> | V <rect key="frame" x="363" y="3" width="200" height="38"/> 和 <rect key="frame" x="284" y="7" […]
我有一个函数采用浮点参数(通常是整数或小数位,有一个有效数字),我需要输出一个string有两位小数(5 – > 5.00,5.5 – > 5.50等)的值。 我怎样才能在Python中做到这一点?