丢失粘滞位的瞻博网络浮点方案/错误的详细信息是什么?

如何解决丢失粘滞位的瞻博网络浮点方案/错误的详细信息是什么?

在某些瞻博网络 MX 路由器上,浮点数未正确处理:如果在计算过程中向右移动超过 8 位(下溢),粘滞位就会丢失。有解决方法吗?是否有任何已知的影响?是否已修复?这是 IEEE 可接受的选项吗?其他系统是否存在该问题?

数学详细信息示例(最好使用固定宽度字体和宽屏幕查看):

                                                                                                                                                                          1
shifts:                                                                                                                                                          12345678901
 4095.05615204245304994401521980762481689453125000000000   = 0x1.ffe1cbff5e3e1p+11 = 0x40affe1cbff5e3e1 =  111111111111.00001110010111111111101011110001111100001
+   1.0000137123424794882708965815254487097263336181640625 = 0x1.0000e60e10001p+0  = 0x3ff0000170168000 =             1.0000000000000000111001100000111000010000000000000001
                                                                                                                                                                           ^
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                                                                                                          1000000000000.000011100110000011100001000000000000000010s
                                                                                                                                                               LGRS
                                                                                                                                                               0101 
                                                                                                                   1          2         3         4         5       
mantissa bit #:                                                                                           1234567890123 4567890123456789012345678901234567890123    
 4096.0561657547959839575923979282379150390625             = 0x1.0000e60e10001p+12 = 0x40b0000e60e10001 = 1000000000000.0000111001100000111000010000000000000001               (on "all" systems/correct)
 4096.056165754795074462890625                             = 0x1.0000e60e10000p+12 = 0x40b0000e60e10000 = 1000000000000.0000111001100000111000010000000000000000               (on Juniper router)
                   ^                                                         ^                        ^                                                        ^

解决方法

Internet source 告诉我许多 MX 系列路由器使用 Intel x86 CPU。当 x87 配置为在扩展精度模式下运行时,观察到的行为与使用 x87 FPU 进行浮点计算(而不是 SSE 或 AVX)完全一致。

x87 FPU 将所有操作数存储在 80 位寄存器中,其中每个寄存器使用 64 个有效数(尾数)位保存一个浮点操作数,有效数的整数位是显式的。 FPU 控制字的第 8 位和第 9 位表示精度控制字段,指示 FPU 将舍入结果的位位置。设置为 2 相当于双精度,设置为 3 表示舍入到扩展精度。

大多数类 Unix 32 位操作系统将 x87 舍入控制设置为 3,而 Windows 将其设置为 2。我不知道现代 Junos 是 32 位还是 64 位操作系统。出于向后兼容的原因,它可能会保留使用 x87 和 FPU 精度控制设置 3。

当 x87 精度控制设置为 3(扩展精度)时,双舍入会出现问题。浮点运算的结果首先四舍五入到扩展精度并存储在内部 FPU 寄存器中。之后,数据从寄存器中取出并再次四舍五入,当这个结果存储到与 double 变量对应的内存位置时。

我使用英特尔编译器从 Windows64 上的问题中编写了特定场景,以便轻松访问 x87 汇编语言指令。程序以三种不同的格式(十进制浮点数、十六进制浮点数和二进制)转储两个源操作数 ab 以及和 r 并转储内部 80 位这些操作数的表示(带有 t 前缀)。

通过将 USE_X87_EXTENDED_PRECISION 定义为 01,FPU 的精度控制可以在计算之前设置为双精度或扩展精度,以及相关的值FPU 控制字显示为compute cw。将 USE_X87_EXTENDED_PRECISION 设置为 0,程序的输出为:

original cw=027f
compute  cw=027f
a=4.0950561520424530e+003  0x1.ffe1cbff5e3e1p+11 40affe1cbff5e3e1 ta=400afff0e5ffaf1f0800
b=1.0000137123424795e+000   0x1.0000e60e10001p+0 3ff0000e60e10001 tb=3fff8000730708000800
r=4.0960561657547960e+003  0x1.0000e60e10001p+12 40b0000e60e10001 tr=400b8000730708000800

然而,当 USE_X87_EXTENDED_PRECISION1 时,结果为:

original cw=027f
compute  cw=037f
a=4.0950561520424530e+003 0x1.ffe1cbff5e3e1p+11 40affe1cbff5e3e1 ta=400afff0e5ffaf1f0800
b=1.0000137123424795e+000  0x1.0000e60e10001p+0 3ff0000e60e10001 tb=3fff8000730708000800
r=4.0960561657547951e+003 0x1.0000e60e10000p+12 40b0000e60e10000 tr=400b8000730708000400

在第二次舍入期间,从 trr,舍入位为 1,但粘性位为 0,因为舍入位之后的所有尾随有效数位为零,因此“偶数”部分默认舍入模式“舍入到最近或偶数”开始。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

#define USE_X87_EXTENDED_PRECISION (1)

typedef struct tbyte {
    uint64_t l;
    uint16_t h;
} tbyte;

uint64_t double_as_uint64 (double a)
{
    uint64_t r; memcpy (&r,&a,sizeof r); return r;
}

int main (void)
{
    double a = 0x1.ffe1cbff5e3e1p+11;
    double b = 0x1.0000e60e10001p+0;
    double r;
    uint16_t cw_orig,cw_comp,cw_temp;
    tbyte ta,tb,tr;

    __asm fstcw word ptr [cw_orig];
#if USE_X87_EXTENDED_PRECISION
    cw_temp = cw_orig | (3 << 8);
    __asm fldcw word ptr [cw_temp];
#endif // USE_X87_EXTENDED_PRECISION
    __asm fstcw word ptr [cw_comp];
    __asm fld qword ptr [a];
    __asm fld qword ptr [b];
    __asm fld st(1);
    __asm fadd st,st(1);
    __asm fst qword ptr [r];
    __asm fstp tbyte ptr [tr];
    __asm fstp tbyte ptr [tb];
    __asm fstp tbyte ptr [ta];
    __asm fldcw word ptr [cw_orig];

    printf ("original cw=%04x\n",cw_orig);
    printf ("compute  cw=%04x\n",cw_comp);
    printf ("a=%23.16e %21.13a %016llx ta=%04x%016llx\n",a,double_as_uint64 (a),ta.h,ta.l);
    printf ("b=%23.16e %21.13a %016llx tb=%04x%016llx\n",b,double_as_uint64 (b),tb.h,tb.l);
    printf ("r=%23.16e %21.13a %016llx tr=%04x%016llx\n",r,double_as_uint64 (r),tr.h,tr.l);

    return EXIT_SUCCESS;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res