小白教程

 找回密码
 立即注册
查看: 10096|回复: 5

[已解决]c/c++里,一段int类型怎么转成float?

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2021-4-2 19:12:28 | 显示全部楼层 |阅读模式
有一段数据是int型,
int *data;
data=(int *)malloc(sizeof(int)*(2^23));

怎么转成float型效率较高?
最佳答案
2021-4-22 08:17:48
你没办法用memcpy啊, 两者之间的内存结构差异太大
只有同种类型的,你用memcpy取代赋值是可行的, int 1和float 1都是32位,但是内存结构上完全不同的, 不能用内存拷贝替代

如果只是char,short,int, long这些可以用memcpy
但是他们和float,double这种之间就没有办法了
赋值不是简单的memcpy,还包含了格式转换这一步
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-4-7 05:43:01 | 显示全部楼层
分配一个int类型的动态内存
和float有什么关系啊

float * data = (float*) malloc(sizeof(float)*(1<<23));

2^23在c里面可不是2的23次方,而是位预算当中的异或操作。

data是4*1024*1024*8 大概32MB的内存不算大
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-4-12 11:41:18 | 显示全部楼层
float表示的范围应该是大于int,所以直接赋值就好了。
回复

使用道具 举报

0

主题

2

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2021-4-16 23:02:18 | 显示全部楼层
需要重新拷贝一遍吧
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-4-22 08:17:48 | 显示全部楼层 &
你没办法用memcpy啊, 两者之间的内存结构差异太大
只有同种类型的,你用memcpy取代赋值是可行的, int 1和float 1都是32位,但是内存结构上完全不同的, 不能用内存拷贝替代

如果只是char,short,int, long这些可以用memcpy
但是他们和float,double这种之间就没有办法了
赋值不是简单的memcpy,还包含了格式转换这一步
回复

使用道具 举报

0

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2021-4-25 13:24:08 | 显示全部楼层
必须用普通循环逐个进行转换并赋值,复杂度为 O(kn)。
在实践中,如果你的平台支持 SIMD,则可以通过手动/编译器优化代码来减小常数 k。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-11-24 13:26 , Processed in 0.025167 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

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