我执行某些数据类型转换,我需要代表uint,long,ulong并decimal为IEEE 754个浮点值.我希望能够在执行转换之前检测IEEE 754数据类型是否包含该值.
一个强力的解决方案是将一个试图捕捉包裹在一个演员周围,以寻找双倍OverflowException.阅读某些CLR文档意味着某些转换只是默默地更改值而没有任何异常.
有没有任何万无一失的方法来做这个检查?我正在寻求完整性而非易于实施.我有一种感觉,我将仔细阅读IEEE 754规范并仔细检查matissa和exponent ......
我应该补充一点,我最关心的是准确地表示整数,浮点精度的损失是次要问题(但仍值得考虑).
编辑: Int32能够完全表达为IEE-754.此外,Decimal数据类型也是问题的一部分.
重要更新:如果您提到这个问题,您还应该阅读这个问题:IEEE-754双(64位浮点)与长(64位整数)重访
它注意到答案中的一个缺陷,其中一些非常大的值也能够由IEEE-754精确表示.虽然这可能意味着该值将正确地往返,为了我的原始目的(它将往返JavaScript)它不会.
此外,CLRs System.Double类型中似乎存在一个错误,因为它没有正确地允许这些值进行往返.
我正在测试powcall(#include <math.h>)上的极端情况pow(-1, Inf).
在我的桌面(Ubuntu)上,我得到了结果1.0,这符合2008 IEEE浮点规范.
我在运行Android Gingerbread内核时运行相同的测试,然后返回NaN.
我环顾四周,可以看到pow标准库中确实存在许多针对不同平台的实现,并且在这种情况下,pow(-1, Inf)它们被编码以产生不同的结果.
问题是哪一个应该被认为是正确的?任何想法或想法?
我很抱歉,如果我在错误的论坛上发帖,我跟着android开发者资源的链接,最后来到这里.
我刚读了一本关于javascript的书.作者提到了IEEE 754标准中的浮点算术舍入误差.
例如,添加0.1和0.2会产生0.30000000000000004而不是0.3.
所以(0.1 + 0.2) == 0.3返回false.
我也在c#中重现了这个错误.
所以这些是我的问题是:
这个错误多久发生一次?c#和javascript中的最佳实践解决方法是什么?哪些其他语言有相同的错误?
如果我在主机和设备(GPU arch sm_13)上执行浮点(单精度)操作,那么值是否会不同?
通常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太.无论它可能是一个标准(!)为什么它是这样的?
为了实现精确的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) 我正在使用非规范化的数字.
我知道:
实质上,非规范化浮点数能够表示可以用任何浮点值表示的SMALLEST(幅度)数.
我也知道数字可以这样表示:

然而,我被卡住的地方是de- /标准化数字的实际计算?
有没有办法做到这一点?有什么特别的号码吗?
非常感谢你的回答!
floating-point binary denormalization floating-accuracy ieee-754
为什么这些简单的双重比较会返回真实?
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精确问题,但我无法弄清楚究竟是什么问题.
这里是Erlang的新手......我需要从List中的原始数据中提取IEEE 754浮点值.例如解码:[42,91,0,0]应该等于72.5并且还将浮点数转换为列表编码:72.5应该转换为[42,91,0,0]是否有任何库支持这些操作?什么是最佳做法?提前致谢.
我的编程环境是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吗?或者我的代码中有问题吗?