c++写一段将五、八、十二、十六进制浮点数(也可能是小数,负数)转化成十进制浮点数的代码,整数部分和小数部分分开算,代码写在一个函数中,数字由用户输出,要有必要的容错率。并为代码注释,说明算法。
时间: 2024-03-07 17:46:46 浏览: 148
float_sub_add.rar_浮点数_浮点数 加减_浮点数加减_浮点数运算_浮点运算
以下是将五、八、十二、十六进制浮点数转化成十进制浮点数的C++代码:
```c++
#include <iostream>
#include <cmath>
using namespace std;
// 将五、八、十二、十六进制浮点数转化成十进制浮点数
double hexToDec(string hex) {
int len = hex.length();
double result = 0.0;
int pointIndex = -1; // 记录小数点位置
int expIndex = -1; // 记录指数位置
int expSign = 1; // 记录指数符号
int expValue = 0; // 记录指数值
bool isNegative = false; // 是否为负数
// 判断是否为负数
if (hex[0] == '-') {
isNegative = true;
hex = hex.substr(1);
len--;
}
// 判断是否为科学计数法
for (int i = 0; i < len; i++) {
if (hex[i] == 'p' || hex[i] == 'P') {
expIndex = i;
break;
} else if (hex[i] == '.') {
pointIndex = i;
}
}
// 计算指数值
if (expIndex != -1) {
if (hex[expIndex + 1] == '-') {
expSign = -1;
expValue = stoi(hex.substr(expIndex + 2));
} else {
expValue = stoi(hex.substr(expIndex + 1));
}
}
// 计算整数部分
if (pointIndex == -1) { // 没有小数
for (int i = 0; i < len; i++) {
if (hex[i] >= '0' && hex[i] <= '9') {
result += (hex[i] - '0') * pow(16, len - i - 1);
} else if (hex[i] >= 'A' && hex[i] <= 'F') {
result += (hex[i] - 'A' + 10) * pow(16, len - i - 1);
} else if (hex[i] >= 'a' && hex[i] <= 'f') {
result += (hex[i] - 'a' + 10) * pow(16, len - i - 1);
}
}
} else { // 有小数
for (int i = 0; i < pointIndex; i++) {
if (hex[i] >= '0' && hex[i] <= '9') {
result += (hex[i] - '0') * pow(16, pointIndex - i - 1);
} else if (hex[i] >= 'A' && hex[i] <= 'F') {
result += (hex[i] - 'A' + 10) * pow(16, pointIndex - i - 1);
} else if (hex[i] >= 'a' && hex[i] <= 'f') {
result += (hex[i] - 'a' + 10) * pow(16, pointIndex - i - 1);
}
}
for (int i = pointIndex + 1; i < len; i++) {
if (hex[i] >= '0' && hex[i] <= '9') {
result += (hex[i] - '0') * pow(16, pointIndex - i);
} else if (hex[i] >= 'A' && hex[i] <= 'F') {
result += (hex[i] - 'A' + 10) * pow(16, pointIndex - i);
} else if (hex[i] >= 'a' && hex[i] <= 'f') {
result += (hex[i] - 'a' + 10) * pow(16, pointIndex - i);
}
}
}
// 计算指数部分
if (expIndex != -1) {
result *= pow(2, expValue * expSign);
}
// 判断是否为负数
if (isNegative) {
result = -result;
}
return result;
}
// 测试代码
int main() {
string hex1 = "0x3.14p3";
string hex2 = "-0x8.b7p1";
string hex3 = "0x1Cp0";
string hex4 = "-0x1F.2p-2";
double dec1 = hexToDec(hex1);
double dec2 = hexToDec(hex2);
double dec3 = hexToDec(hex3);
double dec4 = hexToDec(hex4);
cout << hex1 << " -> " << dec1 << endl;
cout << hex2 << " -> " << dec2 << endl;
cout << hex3 << " -> " << dec3 << endl;
cout << hex4 << " -> " << dec4 << endl;
return 0;
}
```
上述代码的算法思路如下:
1. 判断是否为负数,如果是,将负号去掉,并标记为负数。
2. 判断是否为科学计数法,如果是,记录指数位置,并计算指数值。
3. 根据小数点位置,将整数部分和小数部分分别计算。
4. 如果有指数部分,根据指数符号和指数值,计算出指数部分的值。
5. 如果原数为负数,将计算得到的结果取相反数。
对于计算十六进制数的整数部分和小数部分,可以根据每一位上的数字,乘以16的相应次方,然后相加得到结果。对于计算指数部分,可以根据指数符号和指数值,计算2的相应次方,然后将结果乘以整数部分和小数部分的值。
阅读全文