标签: ieee-754

如何测试数字转换是否会改变值?

我执行某些数据类型转换,我需要代表uint,long,ulongdecimal为IEEE 754个浮点值.我希望能够在执行转换之前检测IEEE 754数据类型是否包含该值.

一个强力的解决方案是将一个试图捕捉包裹在一个演员周围,以寻找双倍OverflowException.阅读某些CLR文档意味着某些转换只是默默地更改值而没有任何异常.

有没有任何万无一失的方法来做这个检查?我正在寻求完整性而非易于实施.我有一种感觉,我将仔细阅读IEEE 754规范并仔细检查matissa和exponent ......

我应该补充一点,我关心的是准确地表示整数,浮点精度的损失是次要问题(但仍值得考虑).

编辑: Int32能够完全表达为IEE-754.此外,Decimal数据类型也是问题的一部分.

重要更新:如果您提到这个问题,您还应该阅读这个问题:IEEE-754双(64位浮点)与长(64位整数)重访

它注意到答案中的一个缺陷,其中一些非常大的值也能够由IEEE-754精确表示.虽然这可能意味着该值将正确地往返,为了我的原始目的(它将往返JavaScript)它不会.

此外,CLRs System.Double类型中似乎存在一个错误,因为它没有正确地允许这些值进行往返.

c# clr ieee-754

3
推荐指数
1
解决办法
426
查看次数

android内核libm pow(float,float)实现

我正在测试powcall(#include <math.h>)上的极端情况pow(-1, Inf).

在我的桌面(Ubuntu)上,我得到了结果1.0,这符合2008 IEEE浮点规范.

我在运行Android Gingerbread内核时运行相同的测试,然后返回NaN.

我环顾四周,可以看到pow标准库中确实存在许多针对不同平台的实现,并且在这种情况下,pow(-1, Inf)它们被编码以产生不同的结果.

问题是哪一个应该被认为是正确的?任何想法或想法?

我很抱歉,如果我在错误的论坛上发帖,我跟着android开发者资源的链接,最后来到这里.

c android ieee-754 android-ndk pow

3
推荐指数
1
解决办法
680
查看次数

c#和javascript中的IEEE 754浮点运算舍入误差

我刚读了一本关于javascript的书.作者提到了IEEE 754标准中的浮点算术舍入误差.

例如,添加0.1和0.2会产生0.30000000000000004而不是0.3.

所以(0.1 + 0.2) == 0.3返回false.

我也在c#中重现了这个错误.

所以这些是我的问题是:

这个错误多久发生一次?c#和javascript中的最佳实践解决方法是什么?哪些其他语言有相同的错误?

javascript c# floating-point ieee-754

3
推荐指数
3
解决办法
3812
查看次数

NVIDIA GPU上的IEEE-754标准(sm_13)

如果我在主机和设备(GPU arch sm_13)上执行浮点(单精度)操作,那么值是否会不同?

floating-point cuda gpgpu ieee-754

3
推荐指数
1
解决办法
769
查看次数

为什么带小数值的指数表示法失败?

通常1e3意味着10**3.

>>> 1e3
1000.0
>>> 10**3
1000
Run Code Online (Sandbox Code Playgroud)

类似案例进行了exp(3)比较e**3.

>>> exp(3)
20.085536923187668
>>> e**3
20.085536923187664
Run Code Online (Sandbox Code Playgroud)

但是现在请注意,如果指数是一个float值:

>>> exp(3.1)
22.197951281441636
>>> e**3.1
22.197951281441632
Run Code Online (Sandbox Code Playgroud)

这很好.现在是第一个例子:

>>> 1e3.1
  File "<stdin>", line 1
    1e3.1
        ^
SyntaxError: invalid syntax
>>> 10**3.1
1258.9254117941675
Run Code Online (Sandbox Code Playgroud)

这表明Python不喜欢1e3.1,Fortran太.无论它可能是一个标准(!)为什么它是这样的?

python floating-point exponent ieee-754

3
推荐指数
2
解决办法
5038
查看次数

将单精度除法实现为双精度乘法

为了实现精确的IEEE 754算术C99编译器,这样做的价值f,divisor类型的float存在,使得f / divisor != (float)(f * (1.0 / divisor))

编辑:通过"实现精确的IEEE 754算术"我的意思是一个正确定义FLT_EVAL_METHOD为0的编译器.

上下文

提供符合IEEE 754标准的浮点的AC编译器只能通过单次精度乘以逆来用常量替换单精度除法,如果所述逆本身可以完全表示为a float.

实际上,这只发生在两个人的权力上.因此,一个程序员Alex可能会确信它f / 2.0f会被编译为好像f * 0.5f,但是如果Alex可以接受0.10f而不是除以10,那么Alex应该通过在程序中编写乘法来表达它,或者使用一个编译器选项,如GCC -ffast-math.

这个问题是关于将单精度除法转换为双精度乘法.它总能产生正确的圆形结果吗?它是否有可能更便宜,因此是编译器可能做出的优化(即使没有-ffast-math)?

我比较(float)(f * 0.10)f / 10.0f为所有单精度值f1和2之间,没有发现任何反例.这应该涵盖float正常结果的所有分区,产生正常结果.

然后我用下面的程序将测试推广到所有除数:

#include <float.h>
#include <math.h>
#include <stdio.h>

int main(void){
  for (float divisor = 1.0; divisor != 2.0; divisor = nextafterf(divisor, 2.0))
    {
      double factor = …
Run Code Online (Sandbox Code Playgroud)

c floating-point c99 ieee-754 compiler-optimization

3
推荐指数
1
解决办法
875
查看次数

什么是最小的de- /标准化数大于1?(64位)

我正在使用非规范化的数字.

我知道:

实质上,非规范化浮点数能够表示可以用任何浮点值表示的SMALLEST(幅度)数.

我也知道数字可以这样表示:

在此输入图像描述

然而,我被卡住的地方是de- /标准化数字的实际计算?

有没有办法做到这一点?有什么特别的号码吗?

非常感谢你的回答!

floating-point binary denormalization floating-accuracy ieee-754

3
推荐指数
1
解决办法
3502
查看次数

将Java Double.Max_VALUE与大双数进行比较,返回true

为什么这些简单的双重比较会返回真实?

System.out.println(Double.MAX_VALUE == (Double.MAX_VALUE - 99 * Math.pow(10, 290)));
System.out.println(new Double(Double.MAX_VALUE).equals(new Double(Double.MAX_VALUE - 99 * Math.pow(10, 290))));
Run Code Online (Sandbox Code Playgroud)

我知道这可能是一个IEEE 754精确问题,但我无法弄清楚究竟是什么问题.

java double ieee-754

3
推荐指数
1
解决办法
688
查看次数

使用Erlang从原始数据解码/编码IEEE 754浮点值?

这里是Erlang的新手......我需要从List中的原始数据中提取IEEE 754浮点值.例如解码:[42,91,0,0]应该等于72.5并且还将浮点数转换为列表编码:72.5应该转换为[42,91,0,0]是否有任何库支持这些操作?什么是最佳做法?提前致谢.

erlang encode decode ieee-754

3
推荐指数
1
解决办法
477
查看次数

Linux gcc(5.4.0)中的浮点数是否符合IEEE754规则?

我的编程环境是gcc版本5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.4)

我的代码如下:

#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, int len){
  int i;
  for (i = 0; i<len; i++)
    printf(" %.2x", start[i]);
  printf("\n");
}

void show_float(float x){
  show_bytes((byte_pointer)&x, sizeof(float));
}

int main(){
  int y = 0xffffff;
  float f = y;
  show_float(f);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

并且机器给出了结果: 00 00 00 e0

根据IEEE 754,我认为这是不对的; 但我不知道为什么.虽然Windows 2013中的VS 2013中的相同代码给出了正确的答案:ff ff 7f 4b

gcc 5.4.0不采用IEEE 754吗?或者我的代码中有问题吗?

c linux floating-point gcc ieee-754

3
推荐指数
1
解决办法
315
查看次数