单精度浮点数转10进制_如何比较两个浮点数

微信限制:不能放置链接代码样式比较奇怪,发布后不能更新。。。

推荐 阅读原文(并建议用浏览器打开,因为微信自带浏览器内核渲染也有问题):

8c3470964ba6cf6a7d000ae21c685b6c.png

很久没写文章了,最近抽时间拼凑一篇短文,记录一下 比较两个(二进制)浮点数是否相等 的几种方法(虽然本文使用 C++ 演示,但原理和语言无关)。

本文主要参考了 “浮点数专家” Bruce Dawson 写的 Comparing Floating Point Numbers, 2012 Edition,也推荐他 关于浮点数的其他文章(最近还一直在更新 ?)。

本文提到的 Equals() / AlmostEqualsAbs() / AlmostEqualsRel() / AlmostEqualsUlp() 函数的具体实现参考 almost_equals.h(在线演示)?

绝对相等?不靠谱

比较两个数是否相等,最直观的 比较方法 就是直接使用 == 进行比较:

f1 == f2  // Equals()

根据 IEEE 754 浮点数标准,浮点数 f85db2e9488df99ae95228e30488b339.png(其中 b 为 固定的基数,± 为 符号位,p 为 尾数,e 为 指数)表示为 符号位-指数-尾数 形式:

  • 十进制浮点数(b == 10)就是 数学中常用的 科学计数法 (scientific notation)

  • 二进制浮点数(b = 2)常用于 计算机中的表示和存储,其中 单精度 (single-precision) 对应 32 位,双精度 (double-precision) 对应 64 位

在 C++ 中,0.1 属于 双精度浮点数,0.1f 属于 单精度浮点数。

为什么计算机使用二进制浮点数?因为基于现有的 CPU 架构,二进制运算效率更高。

虽然在数学上,任意十进制数和二进制数可以 相互转换,它们的 浮点数表示形式 也可以相互转换:

8094d8ca2afedaa5b2553dfaabfe1623.png

在二进制科学计数法中,十进制数 0.1 的尾数 p 是 1.100110011...(0011 循环)但是,有限精度 的二进制浮点数 不能准确表示 所有的十进制数(在线转换工具):

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个将16进制单精度浮点数换为十进制的C语言代码示例: ```c #include <stdio.h> float hexToFloat(char* hex) { float result; sscanf(hex, "%x", &result); return result; } int main() { char hex[9]; // 4个字节的16进制数,加上一个结束符'\0',共9个字符 printf("请输入一个16进制单精度浮点数:"); scanf("%s", hex); float decimal = hexToFloat(hex); printf("对应的十进制数为:%f\n", decimal); return 0; } ``` 代码中的`hexToFloat`函数将接收一个以字符串形式表示的16进制数,并使用`sscanf`函数将其换为对应的浮点数。然后,在`main`函数中,从用户输入获取一个16进制单精度浮点数,并调用`hexToFloat`函数将其换为十进制浮点数,并最后输出结果。 ### 回答2: 下面是一个将16进制单精度浮点数为十进制的C语言代码示例: ```c #include <stdio.h> float hexToDecimal(char* hex) { unsigned int hexValue; sscanf(hex, "%x", &hexValue); unsigned int sign = (hexValue >> 31) & 1; unsigned int exponent = (hexValue >> 23) & 0xFF; unsigned int mantissa = hexValue & 0x7FFFFF; int bias = 127; int expValue = exponent - bias; float decimal = 1.0f; int i; for (i = 0; i < 23; i++) { decimal += ((mantissa >> (22 - i)) & 1) * (1.0f / (1 << (i + 1))); } float result = decimal * powf(2, expValue) * (sign ? -1.0f : 1.0f); return result; } int main() { char* hexNumber = "42B40000"; float decimalNumber = hexToDecimal(hexNumber); printf("十六进制数%x换为十进制数为:%f\n", hexNumber, decimalNumber); return 0; } ``` 在此代码中,我们首先将16进制数换为无符号整数。然后按照IEEE 754标准的浮点数表示法,将整数的各个部分提取出来,包括符号位、指数位和尾数位。 接下来,我们根据指数位计算指数值,并使用尾数位计算小数部分。最后将符号位应用于结果,并乘以2的指数值。 在main函数中,我们定义一个16进制单精度浮点数字符串,并调用hexToDecimal函数将其换为十进制浮点数。最后,我们使用printf函数打印换结果。 这个代码示例只是一个基本的实现,如果要处理更多特殊情况(如非规范化数、无穷大和NaN等),可能需要进行适当的调整。 ### 回答3: 下面是一个用C语言编写的将16进制单精度浮点数换为十进制的代码: ```c #include <stdio.h> float hexToDec(char* hex) { int i; float result = 0; float fraction = 0.5; int exponent = 0; // 跳过"0x"前缀 if (hex[0] == '0' && (hex[1] == 'x' || hex[1] == 'X')) { hex += 2; } // 解析指数部分 while (*hex != 'p' && *hex != 'P') { exponent = exponent * 16 + (*hex - '0'); hex++; } hex++; // 跳过指数部分的p或P // 解析尾数部分 for (i = 0; i < 6; i++) { char c = *hex++; if ('0' <= c && c <= '9') { result = result * 16 + (c - '0'); } else if ('a' <= c && c <= 'f') { result = result * 16 + (c - 'a' + 10); } else if ('A' <= c && c <= 'F') { result = result * 16 + (c - 'A' + 10); } fraction /= 16; } // 根据指数调整尾数部分 result *= pow(2, exponent); // 返回最终结果 return result; } int main() { char hex[10]; printf("请输入一个十六进制浮点数:"); scanf("%s", hex); float decimal = hexToDec(hex); printf("换为十进制:%f\n", decimal); return 0; } ``` 使用时,用户需要输入一个十六进制浮点数,程序将会输出对应的十进制浮点数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值