📄 test_ieee.c
字号:
#include "test.h"#include <ieeefp.h>/* Test fp getround and fp setround */void_DEFUN_VOID(test_getround){ newfunc("fpgetround/fpsetround"); line(1); fpsetround(FP_RN); test_iok(fpgetround(), FP_RN); line(2); fpsetround(FP_RM); test_iok(fpgetround(), FP_RM); line(3); fpsetround(FP_RP); test_iok(fpgetround(), FP_RP); line(4); fpsetround(FP_RZ); test_iok(fpgetround(), FP_RZ);}/* And fpset/fpgetmask */void_DEFUN_VOID(test_getmask){ newfunc("fpsetmask/fpgetmask"); line(1); fpsetmask(FP_X_INV); test_iok(fpgetmask(),FP_X_INV); line(2); fpsetmask(FP_X_DX); test_iok(fpgetmask(),FP_X_DX); line(3); fpsetmask(FP_X_OFL ); test_iok(fpgetmask(),FP_X_OFL); line(4); fpsetmask(FP_X_UFL); test_iok(fpgetmask(),FP_X_UFL); line(5); fpsetmask(FP_X_IMP); test_iok(fpgetmask(),FP_X_IMP);}void_DEFUN_VOID(test_getsticky){ newfunc("fpsetsticky/fpgetsticky"); line(1); fpsetsticky(FP_X_INV); test_iok(fpgetsticky(),FP_X_INV); line(2); fpsetsticky(FP_X_DX); test_iok(fpgetsticky(),FP_X_DX); line(3); fpsetsticky(FP_X_OFL ); test_iok(fpgetsticky(),FP_X_OFL); line(4); fpsetsticky(FP_X_UFL); test_iok(fpgetsticky(),FP_X_UFL); line(5); fpsetsticky(FP_X_IMP); test_iok(fpgetsticky(),FP_X_IMP);}void_DEFUN_VOID(test_getroundtoi){ newfunc("fpsetroundtoi/fpgetroundtoi"); line(1); fpsetroundtoi(FP_RDI_TOZ); test_iok(fpgetroundtoi(),FP_RDI_TOZ); line(2); fpsetroundtoi(FP_RDI_RD); test_iok(fpgetroundtoi(),FP_RDI_RD);}double _DEFUN(dnumber,(msw, lsw), int msw _AND int lsw){ __ieee_double_shape_type v; v.parts.lsw = lsw; v.parts.msw = msw; return v.value;} /* Lets see if changing the rounding alters the arithmetic. Test by creating numbers which will have to be rounded when added, and seeing what happens to them */ /* Keep them out here to stop the compiler from folding the results */double n;double m;double add_rounded_up;double add_rounded_down;double sub_rounded_down ;double sub_rounded_up ; double r1,r2,r3,r4;void_DEFUN_VOID(test_round){ n = dnumber(0x40000000, 0x00000008); /* near 2 */ m = dnumber(0x40400000, 0x00000003); /* near 3.4 */ add_rounded_up = dnumber(0x40410000, 0x00000004); /* For RN, RP */ add_rounded_down = dnumber(0x40410000, 0x00000003); /* For RM, RZ */ sub_rounded_down = dnumber(0xc0410000, 0x00000004); /* for RN, RM */ sub_rounded_up = dnumber(0xc0410000, 0x00000003); /* for RP, RZ */ newfunc("fpsetround"); line(1); fpsetround(FP_RN); r1 = n + m; test_mok(r1, add_rounded_up, 64); line(2); fpsetround(FP_RM); r2 = n + m; test_mok(r2, add_rounded_down, 64); fpsetround(FP_RP); line(3); r3 = n + m; test_mok(r3,add_rounded_up, 64); fpsetround(FP_RZ); line(4); r4 = n + m; test_mok(r4,add_rounded_down,64); fpsetround(FP_RN); r1 = - n - m; line(5); test_mok(r1,sub_rounded_down,64); fpsetround(FP_RM); r2 = - n - m; line(6); test_mok(r2,sub_rounded_down,64); fpsetround(FP_RP); r3 = - n - m; line(7); test_mok(r3,sub_rounded_up,64); fpsetround(FP_RZ); r4 = - n - m; line(8); test_mok(r4,sub_rounded_up,64);}void_DEFUN_VOID(test_ieee){ fp_rnd old = fpgetround(); test_getround(); test_getmask(); test_getsticky(); test_getroundtoi(); test_round(); fpsetround(old); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -