编写C++代码实现二进制浮点数输入,显示其十进制数值结果,所有5类(可以是0,非正规化数,正规化数,无穷,NaN)浮点结果都要进行测试和结果显示。输入为一个32位的数据表示一个32位的二进制浮点数
编写C++代码实现二进制浮点数输入,显示其十进制数值结果,所有5类(可 以是0,非正规化数,正规化数,无穷,NaN)浮点结果都要进行测试和结果显示输入为一个32位的数据表示一个32位的二进制浮点数
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 赵4老师 2022-05-11 09:20关注
仅供参考:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { float f; double d; char bs[65]; char b[65]; char s[80]; unsigned char *p; char e[12]; char *t; int ex; int flag; flag=0; while (1) { printf("Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:");fflush(stdout); rewind(stdin); fgets(s,80,stdin); if ('\n'==s[0]) return 1; if (1==sscanf(s,"0x%16I64X",(__int64 *)&d) && strlen(s)>11) {flag=2;break;} if (1==sscanf(s,"0x%8X" ,( int *)&f)) {flag=1;break;} if (1==sscanf(s,"%f" , &f) && 1==sscanf(s,"%lf" , &d)) {flag=3;break;} } if (flag&1) { printf("f=%g\n",f); p=(unsigned char *)&f; printf("hex=%02X %02X %02X %02X\n",p[3],p[2],p[1],p[0]); ltoa(*(long *)&f,b,2); sprintf(bs,"%032s",b); printf("bin=%s\n",bs); printf("bin=%.1s %.8s %s\n",bs,bs+1,bs+9); strncpy(e,bs+1,8);e[8]=0; ex=strtol(e,&t,2); printf(" %c %-4d-127 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9); ex-=127; printf(" %c %-8d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9); } if (flag&2) { printf("\nd=%lg\n",d); p=(unsigned char *)&d; printf("hex=%02X %02X %02X %02X %02X %02X %02X %02X\n",p[7],p[6],p[5],p[4],p[3],p[2],p[1],p[0]); _i64toa(*(__int64 *)&d,b,2); sprintf(bs,"%064s",b); printf("bin=%s\n",bs); printf("bin=%.1s %.11s %s\n",bs,bs+1,bs+12); strncpy(e,bs+1,11);e[11]=0; ex=strtol(e,&t,2); printf(" %c %-6d-1023 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12); ex-=1023; printf(" %c %-11d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12); } return 0; } //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0x3FC0000000000000 // //d=0.125 //hex=3F C0 00 00 00 00 00 00 //bin=0011111111000000000000000000000000000000000000000000000000000000 //bin=0 01111111100 0000000000000000000000000000000000000000000000000000 // + 1020 -1023 1.0000000000000000000000000000000000000000000000000000 // + -3 1.0000000000000000000000000000000000000000000000000000 // //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0x3E000000 // //f=0.125 //hex=3E 00 00 00 //bin=00111110000000000000000000000000 //bin=0 01111100 00000000000000000000000 // + 124 -127 1.00000000000000000000000 // + -3 1.00000000000000000000000 // //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0.125 //f=0.125 //hex=3E 00 00 00 //bin=00111110000000000000000000000000 //bin=0 01111100 00000000000000000000000 // + 124 -127 1.00000000000000000000000 // + -3 1.00000000000000000000000 // //d=0.125 //hex=3F C0 00 00 00 00 00 00 //bin=0011111111000000000000000000000000000000000000000000000000000000 //bin=0 01111111100 0000000000000000000000000000000000000000000000000000 // + 1020 -1023 1.0000000000000000000000000000000000000000000000000000 // + -3 1.0000000000000000000000000000000000000000000000000000 // //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX: //
// https://docs.microsoft.com/en-us/cpp/c-runtime-library/format-specification-syntax-printf-and-wprintf-functions?view=vs-2019 // https://docs.microsoft.com/zh-cn/cpp/porting/visual-cpp-change-history-2003-2015?view=vs-2019 // // Starting in Visual Studio 2015, if the argument that corresponds to a floating-point conversion specifier (a, A, e, E, f, F, g, G) is infinite, // indefinite, or NaN, the formatted output conforms to the C99 standard. This table lists the formatted output: // Value Output // -------------- --------- // infinity inf // Quiet NaN nan // Signaling NaN nan(snan) // Indefinite NaN nan(ind) // Any of these values may be prefixed by a sign. If a floating-point type conversion specifier character is a capital letter, // then the output is also formatted in capital letters. For example, if the format specifier is %F instead of %f, an infinity // is formatted as INF instead of inf. The scanf functions can also parse these strings, so these values can make a round trip // through printf and scanf functions. // // Before Visual Studio 2015, the CRT used a different, non-standard format for output of infinite, indefinite, and NaN values: // Value Output // ------------------------------ ------------------------- // + infinity 1.#INF random-digits // - infinity -1.#INF random-digits // Indefinite (same as quiet NaN) digit .#IND random-digits // NaN digit .#NAN random-digits // Any of these may have been prefixed by a sign, and may have been formatted slightly differently depending on field width and precision, // sometimes with unusual effects. For example, printf("%.2f\n", INFINITY) would print 1.#J because the #INF would be "rounded" to 2 digits of precision. #include <stdio.h> #include <float.h> int main() { int r; double d1=-1.0,d2=-2.0; printf("input two double (d1 d2):"); r=scanf("%lf%lf",&d1,&d2); printf("scanf return:%d d1:%lg d2:%lg\n",r,d1,d2); printf("_finite(d1):%d\n",_finite(d1)); printf("_fpclass(d1):0x%04X\n",_fpclass(d1)); return 0; } // input two double (d1 d2):nan 22 // scanf return:2 d1:nan d2:22 // _finite(d1):0 // _fpclass(d1):0x0002 // // input two double (d1 d2):nan(snan) 22 // scanf return:2 d1:nan(snan) d2:22 // _finite(d1):0 // _fpclass(d1):0x0002 // // input two double (d1 d2):nan(ind) 22 // scanf return:2 d1:-nan(ind) d2:22 // _finite(d1):0 // _fpclass(d1):0x0002 // // input two double (d1 d2):-inf 22 // scanf return:2 d1:-inf d2:22 // _finite(d1):0 // _fpclass(d1):0x0004
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 如何让企业微信机器人实现消息汇总整合
- ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
- ¥15 如何用Python爬取各高校教师公开的教育和工作经历
- ¥15 TLE9879QXA40 电机驱动
- ¥20 对于工程问题的非线性数学模型进行线性化
- ¥15 Mirare PLUS 进行密钥认证?(详解)
- ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
- ¥20 想用ollama做一个自己的AI数据库
- ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
- ¥15 请问怎么才能复现这样的图呀