找回密码
 立即注册

微信扫码登录

查看: 256|回复: 3

8258的模拟浮点库怎么才能支持64位运算?

[复制链接]

5

主题

8

回帖

67

积分

注册会员

积分
67
发表于 2024-9-1 23:11:47 | 显示全部楼层 |阅读模式
大家好,

      telink的8258没有浮点运算单元,在zigbee sdk中,加入了模拟浮点库,但是这个库只支持32位运算,如何才能支持64位运算?希望得到你们的帮助谢谢

2

主题

20

回帖

1037

积分

版主

积分
1037
发表于 2024-9-2 09:34:23 | 显示全部楼层
你好,这个只能靠用整形运算来实现64位浮点运算。如果不太在乎运算速度,那么就不需要底层用汇编来优化。可以用C,通过整形运算来实现64位浮点运算。

网上又很多64位运算的库可以参考,比如Berkeley SoftFloat)
http://www.jhauser.us/arithmetic/SoftFloat.html

https://github.com/SDL-Hercules-390/SoftFloat

可以尝试将这些库的关键部分的C函数拿出来,先用上位机环境编译一下看看结果,如果好用,并且没有底层的各种依赖,直接放到我们的环境钟编译即可。

另外说些题外话,嵌入式真的不建议用浮点运算(速度慢),如果又哪些应用的需要计算的话,可以考虑把其中的各种数据等比例放大2的N次方(每一步骤的N可能并不同),转成整数运算。
最后的结果如果真的要浮点显示出来。可以考虑最后一步进行转化(比如如果中间运算过程总共等比例放大了2的M次方,那么最后得到的整数,最右边的M位就是小数位)。
这样即使需要显示。那么很容易把最后的这个数字变成浮点数的形式。

5

主题

8

回帖

67

积分

注册会员

积分
67
 楼主| 发表于 2024-9-2 09:46:37 | 显示全部楼层
本帖最后由 haiou 于 2024-9-2 09:52 编辑
TL_ZXD 发表于 2024-9-2 09:34
你好,这个只能靠用整形运算来实现64位浮点运算。如果不太在乎运算速度,那么就不需要底层用汇编来优化。可 ...

你好,感谢你的回答,其实我也是转换为整数运算,但是我的值太大,32位(uint32_t)不够用,需要六十四位(uint64_t)的变量存储,但是我用64位变量运算时,调用telink的 软件浮点库会报错,还有什么办法做到用64位变量参与运算么

2

主题

20

回帖

1037

积分

版主

积分
1037
发表于 2024-9-2 10:38:05 | 显示全部楼层
haiou 发表于 2024-9-2 09:46
你好,感谢你的回答,其实我也是转换为整数运算,但是我的值太大,32位(uint32_t)不够用,需要六十四位(u ...

64位进行运算时,如果直接写加减乘除运算符,gcc编译器看到代码企图用64位数进行运算,它会把这个运算变成一些底层的函数来实现(这些接口是固定的,需要开发人员或者做编译器的人用一些库实现)。
目前最快的做法可能是自己写一些函数。来进行64位运算,下面是一些64位整数运算的实现例子,可以参考一下。其中有些代码是C++的,但是转成C实现也比较容易。
相比而言64位整数运算比64位浮点运算,用C语言实现要容易的多。因为没有很多指数操作。



https://blog.csdn.net/Addrews/article/details/105635288


https://www.cnblogs.com/AANA/p/16373834.html




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telink forum ( 沪ICP备17008231号-1 )

GMT+8, 2024-10-12 07:13 , Processed in 0.078599 second(s), 18 queries .

Powered by Telink 隐私政策

泰凌微电子版权所有 © 。保留所有权利。 2024

快速回复 返回顶部 返回列表