字符串转浮点数

直接上代码:

#include<stdio.h>
double my_atof(char *str)
{
	char *p = NULL;
	double result1 = 0, result2 = 0, result = 0;
	int flag = 0;
	double temp = 10;
	p = str;
	if(NULL == str)
		return -1;
		
	if('-' == *p) {
		flag = 1;
		p++;
	}
	
	while(p != NULL && (*p<= '9' && *p >= '0'))
	{
	
		result1 = result1 * 10 + (*p -48);
		p++;
	}
	if('.' == *p)
	{
		p++;
		while(p != NULL && (*p<= '9' && *p >= '0'))
		{
			result2 = result2 + (double)(*p -48)/temp;;
			temp = temp * 10;
			p++;
		}
	}
		result = result1 + result2;
		
	if(1 == flag)result = -result;
	
	return result;
}

void main()
{
	char szString[] = "-012345678999.0123456789";
	double db2 = 1123456789123456789.0;
	int i = 1;
	double db3, db4 = 0.123456;
	db3 = db2 + db4;
	printf(" db3 = %f\n",db3);
	//printf("%c \n", szString[3]);
	db2 = my_atof(szString);
		printf("/nsscanf result:\n");
    printf("%f  %.12f  %.2f  %e  %E\n", db2, db2, db2, db2, db2);
}

注意如果 浮点数 '.' 号前面的数字很大,两个数相加会出现问题,暂时没有找到解决 方法

另外是直接调用标准接口,见:

http://blog.youkuaiyun.com/loomman/article/details/3373298


<think>嗯,用户的问题是关于如何在LabVIEW中将32进制字符串换为浮点数。首先,我需要确认用户所说的“32进制字符串”具体指的是什么。通常,进制换常见的是二进制、十六进制、十进制等,32进制比较少见,可能存在误解。不过根据提供的引用内容,用户可能指的是十六进制字符串,或者是其他二进制数据格式的字符串表示。例如,引用[3]提到了将浮点数换为十六进制字符串的方法,引用[4]则是关于双精度浮点数换为16位数的数组,这可能涉及到二进制或十六进制的处理。 接下来,用户提到的LabVIEW环境需要将字符串换为浮点数。根据引用[1],LabVIEW中的字符串处理涉及将数值换为字符串以便存储或传输,而逆过程则需要解析字符串换回数值。引用[2]和[3]讨论了从串口接收数据并换为浮点数的方法,其中可能需要处理二进制或十六进制字符串。 可能的换方法包括: 1. **十六进制字符串浮点数**:如果字符串是十六进制表示的浮点数的二进制数据,可以使用LabVIEW中的“Type Cast”函数,将字符串的字节数组换为浮点数。例如,引用[3]中的Delphi代码将浮点数的内存地址换为十六进制字符串,逆过程则需要将十六进制字符串还原为字节数组,再类型换为浮点数。 2. **二进制字符串浮点数**:如果字符串是二进制格式,可能需要先将其换为字节数组,再使用“Type Cast”处理。 3. **处理数据拼接**:如引用[2]提到的,串口数据可能需要拼接多次接收的8位数据成32位浮点数,LabVIEW中可能需要使用“Join Numbers”或类似的函数组合字节。 4. **考虑字节顺序**:不同的系统可能使用大端或小端格式,换时需确认字节顺序是否正确,必要时进行反。 需要验证用户的具体情况:字符串是十六进制还是二进制,是否包含符号、指数部分,或者是否是直接的二进制数据。例如,用户提到的“32进制”可能是笔误,实际应为十六进制或32位二进制数据。假设用户实际需要将十六进制字符串换为浮点数,步骤大致如下: 1. 将十六进制字符串换为字节数组。可以使用“Hexadecimal String To Number”函数,但需要注意字符串长度是否为8个字符(32位浮点数占用4字节,每个字节两位十六进制)。 2. 调整字节顺序(大端或小端)。 3. 使用“Type Cast”将字节数组换为单精度浮点数。 此外,引用[4]中的QT代码处理双精度浮点数拆分为多个16位整数,类似地,在LabVIEW中可能需要将接收到的多个16位整数组合成32位或64位的数据,再换为浮点数。 总结步骤: - 确认输入字符串的格式(十六进制、二进制等)和长度。 - 换为字节数组,处理字节顺序。 - 使用类型换函数得到浮点数。 可能遇到的问题包括字符串格式不正确、字节顺序错误、数据拼接错误等,需要根据具体情况调试。例如,引用[2]中提到的连续接收4次8位数据组成32位浮点数,需在LabVIEW中正确拼接并换。</think>### LabVIEW中将32进制字符串换为浮点数的方法 在LabVIEW中实现**十六进制字符串浮点数**的换(假设用户提到的“32进制”实际为十六进制),需按照以下步骤操作: 1. **字符串预处理** 确保输入字符串为完整的十六进制表示。例如,32位单精度浮点数对应8位十六进制字符(如`"4048F5C3"`),每个字节用两个字符表示。 2. **换为字节数组** 使用`Hexadecimal String To Number`函数,将十六进制字符串换为U8(无符号8位整数)数组。例如: - 输入字符串`"4048F5C3"` → 换为`[0x40, 0x48, 0xF5, 0xC3]`[^3]。 3. **调整字节顺序(可选)** 若数据存储为小端模式(低位在前),需反字节数组。例如: - 原数组`[0x40, 0x48, 0xF5, 0xC3]` → 反后`[0xC3, 0xF5, 0x48, 0x40]`[^2]。 4. **类型换** 使用`Type Cast`函数,将字节数组换为单精度浮点数(SGL)。配置`Type Cast`的输入为U8数组,输出类型设置为`Single`[^1]。 --- ### 实现流程图 ```plaintext [十六进制字符串] → [Hexadecimal String To Number] → [U8数组] → [反数组(可选)] → [Type Cast] → [浮点数] ``` --- ### 示例代码 LabVIEW中可通过以下节点搭建程序: 1. **字符串输入控件**:接收十六进制字符串(如`"4048F5C3"`)。 2. **Hexadecimal String To Number**:输出U8数组。 3. **Reverse 1D Array**(如需小端处理):反字节顺序。 4. **Type Cast**:配置目标类型为`Single`,输出浮点数。 --- ### 注意事项 - **数据完整性**:确保字符串长度匹配(如单精度浮点数为8字符,双精度为16字符)[^3]。 - **字节顺序**:根据数据来源选择大端(默认)或小端模式。 - **异常处理**:添加校验逻辑,避免非十六进制字符导致错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值