int转float的坑

问题

首先来看问题代码,没什么好说的,就是让用户输入两个int类型的参数,然后做除法。由于结果可能是小数,所以用float接收计算的结果。
在这里插入图片描述
如果输入的两个数字太大,接近int的极限取值,就会出错,请看结果。
在这里插入图片描述
这里出错的原因就在于把int转为了float。



int和float的存储方式

float

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

int

在这里插入图片描述

int转float

int的最大取值2147483647,写成二进制就是这样
在这里插入图片描述
可以看成是:0111 1111 1111 1111.0,需要把小数点移动到最前面的1后面,像这样
在这里插入图片描述
小数点左移了30位,float的指数部分就是127+30=157,写成二进制 1001 1101。然后把小数部分放到float的尾数部分,但是这里小数部分有30位,而float只能装下23位的尾数,装不下的就会被丢弃,这也正是把int转float做除法结果出错的原因。

现在float里面的内容

在这里插入图片描述
这里可以很明显看出,int的最后7位被丢弃了。



测试和验证

我们可以写一个程序实际测试一下就知道了

测试程序的代码

在这里插入图片描述

输出结果

在这里插入图片描述
这个结果可能不是很清晰,但已经可以看出规律了,试试不输出相同的数字
注释掉这部分代码,再输出试试
在这里插入图片描述

调整后输出结果

在这里插入图片描述
这样规律就更明显了,这就验证了前面我们说的后7位被丢弃的猜想。

  • 15
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要将float32数据换为Ort::Float16_t类型(即float16),可以使用ONNX Runtime提供的API进行换。以下是一种可能的方法: ```cpp #include <onnxruntime/core/providers/cuda/cuda_provider_factory.h> #include <onnxruntime/core/providers/cpu/cpu_provider_factory.h> #include <onnxruntime/core/providers/cpu/math/quantize_linear.h> #include <onnxruntime/core/providers/cpu/math/dequantize_linear.h> // ... // Create an Ort::Allocator with the desired memory allocation strategy Ort::AllocatorWithDefaultOptions allocator; // Create input and output tensors Ort::Value input_tensor = Ort::Value::CreateTensor<float>(allocator, input_data, input_size, input_shape.data(), input_shape.size()); Ort::Value output_tensor = Ort::Value::CreateTensor<Ort::Float16_t>(allocator, nullptr, output_size, output_shape.data(), output_shape.size()); // Get the quantization parameters (scale and zero point) for float16 conversion float scale = ...; // Compute or set the scale factor for quantization int32_t zero_point = ...; // Compute or set the zero point for quantization // Quantize the input tensor from float32 to float16 Ort::QuantizeLinear<float, Ort::Float16_t>(input_tensor.GetTensorMutableData<float>(), output_tensor.GetTensorMutableData<Ort::Float16_t>(), input_size, scale, zero_point); // Perform computations using the quantized input tensor // ... // Dequantize the output tensor back to float32 Ort::DequantizeLinear<Ort::Float16_t, float>(output_tensor.GetTensorMutableData<Ort::Float16_t>(), output_tensor.GetTensorMutableData<float>(), output_size, scale, zero_point); ``` 请注意,这只是一种示例,并且具体的代码实现可能会根据您的应用程序和环境而有所不同。您还需要根据实际情况设置输入数据、尺寸和形状,并计算或设置适当的量化参数(比例因子和零点)。 此外,请确保已正确配置和初始化ONNX Runtime,并根据所选的硬件和提供程序(如CUDA或CPU)进行设置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值