如何判断四个字节的内容不是浮点数?

kerplayer 2001-09-17 10:38:35
我有四个字节的东西(通过串口通讯得到的),我是这样把它转化为浮点数的:
char *p,temp[4];
float f;
AnsiString s;
temp[0]=*p;
temp[1]=*(p+1);
temp[2]=*(p+2);
temp[3]=*(p+3);
f1=0;
f=*(float *)(&temp);
s=FloatToStr(f);
但如果四个字节的东西代表的并不是浮点数,则会使程序执行s=FloatToStr(f)时出现一个用try也无法避免的错误,加上以下判断也不行:
try
{
if (_isnan(f))
{f=0;}
}
catch (...)
{
f=0;
}
请问我该如何判断四个字节的东西代表的并不是浮点数?
我email:woshizhangwuji@163.net
我只能加23分。
...全文
391 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
kerplayer 2001-09-21
  • 打赏
  • 举报
回复
我还是先给分了。
MountLion 2001-09-20
  • 打赏
  • 举报
回复
: kerplayer(含玉) 
原来你用的是指针。我想错误的原因可能是:在一个需要 double* 或者 long double* 的地方,你使用了 float*;
比如有
foo(long double *);

你用
p=(float*)temp;
foo(p);
这样当然错了。

改成这样就对了:
p=(float*)temp;
long double df=*p;
foo(&df);
kerplayer 2001-09-20
  • 打赏
  • 举报
回复
to BCB(:))
可能加不加&都对(对数组也许这样。我程序正常运行,所以也不想测试了);
另外,我从你提供的网址http://arch.cs.pku.edu.cn/users/cgz/assembler_u上找到了不是浮点数的定义:即4个字节变成32bit的话,第1bit为符号位,2-9bit为指数位,10-32为小数位,如果指数位全为1,小数位不全为0,则此4字节内容不是合法的浮点数。等我出差到程序所在地解决问题后,我再给各位加分。各位有什么想法还可以继续讨论。我有空会来看一下。或者谁提供一些更好的网址?对编程有效的搜索网站?
BCB 2001-09-20
  • 打赏
  • 举报
回复
f=*(float *)(&temp)
我不明白 temp前你为什么要加 &,它本来就已经是地址了,
难道我也糊涂了
kerplayer 2001-09-20
  • 打赏
  • 举报
回复
BCB(:)):
你给的网址我正在看,我必定给分你。
kerplayer 2001-09-20
  • 打赏
  • 举报
回复
sinmin(天凉好个秋)和MountLion(人不寐):
别的公司与我的通讯协议就是该4个字节代表一个单精度值的浮点数。一般下程序源源不断的接收数据10几天没问题,但如对方公司硬件关机或意外的话,我的程序就死在浮点数的地方了,而我的程序应该是无人看管的。
sinmin 2001-09-19
  • 打赏
  • 举报
回复
不能判断四个字节的内容是否是浮点数,
在未知的情况下, 什么数据类型都有可能
比如说四个字符 或者两个16位的整数, 或者一个32位的整数, 包括带符号或不带符号的
MountLion 2001-09-19
  • 打赏
  • 举报
回复
: kerplayer(含玉) 
你的程序和我的有何不同吗?看不出来
即使用伪代码,也不该是0 to 256,而应该是 0 to 255,然而,如果你这样写:
unsigned char i,j,k,l;
for (i=0;i<=255;i++)
...
那么就是死循环……
所以你最好还是贴真实的代码……
我相信错误不在float转换……
BCB 2001-09-19
  • 打赏
  • 举报
回复
四个字节的浮点数可能是单精度的浮点数
BCB 2001-09-19
  • 打赏
  • 举报
回复
www.google.com中搜到的
http://arch.cs.pku.edu.cn/users/cgz/assembler_u/14/sld003.htm
kerplayer 2001-09-19
  • 打赏
  • 举报
回复
up
kerplayer 2001-09-19
  • 打赏
  • 举报
回复
我又加分到我能加的最高了。
kerplayer 2001-09-19
  • 打赏
  • 举报
回复
to:ylm163net(文秀)
我确实试过了,任意四个字节并不必然可以表示为一个浮点数

BCB(:)):
我也希望能看到浮点数的格式,不知哪里可以查到?

MountLion(人不寐):
我的那个循环变量i是个整数,不是unsigned char型,所以虽然0to256多算了一次,但也不致于死循环。我确实试过了,硬把一个字符型指针转化为浮点数指针的话,转化时是不出错的,但如何接着对浮点数指针所对应的浮点数进行操作(如floattostr)的话,就会出错。要不请大家告诉我哪里可以查到浮点数的格式?


kerplayer 2001-09-18
  • 打赏
  • 举报
回复
哪位高手回答呀?
BCB 2001-09-18
  • 打赏
  • 举报
回复
是呀!了解一个浮点的格式就能明白了,可查到.
既使能判定是一个浮点,也不能说它就是正确的数据!
ylm163net 2001-09-18
  • 打赏
  • 举报
回复
没办法判断是否是浮点数,
浮点数用4个字节表示,
任意四个字节必然可以表示为一个浮点数
kerplayer 2001-09-18
  • 打赏
  • 举报
回复
to MountLion(人不寐):
你那段程序其实显示计算机里依次相邻的4个字节的数;我是这样的:
char *p,temp[4];
float f;
AnsiString s;
//下列语句是伪语言:
for i:=0 to 256 do
{temp[0]=i
for j:=0 to 256 do
{temp[1]=j
for k:=0 to 256 do
{temp[2]=k
for l:=0 to 256 do
{temp[3]=l
f=*(float *)(&temp);
s=FloatToStr(f);
}
}
}
}

MountLion 2001-09-18
  • 打赏
  • 举报
回复
意思是说,所有的4Bytes都可以转换成float,当然其中可能有NaN,Infinit等,但都是合法的float
MountLion 2001-09-18
  • 打赏
  • 举报
回复
你曾经编程得到无数个,俺也编程了,一个都没有找到:
register unsigned long a=0;
register float b;
do{
b=*(float*)&a;
a++;
if(a%10000000==0) showIt(b);
}while(a!=0); //until overflow
kerplayer 2001-09-18
  • 打赏
  • 举报
回复
我加分了。
加载更多回复(7)
课程背景Modbus 协议是工业自动化控制系统中常见的通信协议,协议的全面理解是个痛点。本课程主讲老师集10多年在Modbus协议学习、使用中的经验心得,结合当前物联网浪潮下Modbus协议开发的痛点,推出这套面向Modbus 协议初学者的课程。本课程不同于以往市面课程只是协议讲解无实现代码,而是采用讲解与实践并重的方式,结合STM32F103ZET6开发板进行手把手编程实践,十分有利于初学者学习。涵盖了学习者在Modbus协议方面会遇到的方方面面的问题,是目前全网首个对Modbus协议进行全面总结的课程。课程名称   协议讲解及实现>>课程内容1、Modbus 协议的基础。2、Modbus协议栈函数编程实现。3、Modbus协议在串行链路编程实现。4、Modbus协议在以太网链路编程实现。5、常见问题的解决方法。带给您的价值通过学习本课程,您可以做到如下:1、全面彻底的理解Modbus协议。2、理解在串行链路,以太网链路的实现。3、掌握Modbus协议解析的函数编程方法,调试工具的使用。4、掌握多个串口,网口同时运行同一个Modbus协议栈的方法。5、掌握Modbus协议下,负数,浮点数等处理方法。讲师简介许孝刚,山东大学工程硕士,副高职称,技术总监。10多年丰富嵌入式系统开发经验,国家软考“嵌入式系统设计师”。2017年获得“华为开发者社区杰出贡献者”奖励。

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧