Test Code
#ifndef _C_TEST_H_
#define _C_TEST_H_
#if 0
#define TEST_TYPE double
#else
#define TEST_TYPE float
#endif
void test1(void){
TEST_TYPE d0 = 0.0;
TEST_TYPE d1 = 123.456;
TEST_TYPE d2 = (2147483647.456 + 2);
int i0 = d0;
int i1 = d1;
int i2 = d2;
printf("[%f], [%d]\n", d0, i0);
printf("[%f], [%d]\n", d1, i1);
printf("[%f], [%d]\n", d2, i2);
}
void test2(void){
TEST_TYPE d0 = 0.0;
TEST_TYPE d1 = 123.456;
TEST_TYPE d2 = (2147483647.456 + 2);
int i0 = (int)d0;
int i1 = (int)d1;
int i2 = (int)d2;
printf("[%f], [%d]\n", d0, i0);
printf("[%f], [%d]\n", d1, i1);
printf("[%f], [%d]\n", d2, i2);
}
int test3_sub(int _param){
return _param;
}
void test3(void){
TEST_TYPE d0 = 0.0;
TEST_TYPE d1 = 123.456;
TEST_TYPE d2 = (2147483647.456 + 2);
printf("[%f], [%d]\n", d0, test3_sub(d0));
printf("[%f], [%d]\n", d1, test3_sub(d1));
printf("[%f], [%d]\n", d2, test3_sub(d2));
}
void test4(void){
TEST_TYPE d0 = 123.565;
TEST_TYPE d1 = 123.464;
TEST_TYPE d2 = 19.9;
int i0 = d0;
int i1 = d1;
int i3 = d2 * 100;
printf("[%f], [%d]\n", d0, i0);
printf("[%f], [%d]\n", d1, i1);
printf("[%.2f], [%d]\n", d0, i0);
printf("[%.2f], [%d]\n", d1, i1);
printf("[%f], [%f], [%d], [%d], [%d]\n", d2, d2 * 100, i3, (d2 * 100), (TEST_TYPE)(d2 * 100));
}
#endif /**< _C_TEST_H_ */
Test Result
double
test1 :
[0.000000], [0]
[123.456000], [123]
[2147483649.456000], [-2147483648]
test2 :
[0.000000], [0]
[123.456000], [123]
[2147483649.456000], [-2147483648]
test3 :
[0.000000], [0]
[123.456000], [123]
[2147483649.456000], [-2147483648]
test4 :
[123.565000], [123]
[123.464000], [123]
[123.57], [123]
[123.46], [123]
[19.900000], [1990.000000], [1989], [-1], [1084168191]
float
test1 :
[0.000000], [0]
[123.456001], [123]
[2147483648.000000], [-2147483648]
test2 :
[0.000000], [0]
[123.456001], [123]
[2147483648.000000], [-2147483648]
test3 :
[0.000000], [0]
[123.456001], [123]
[2147483648.000000], [-2147483648]
test4 :
[123.565002], [123]
[123.463997], [123]
[123.57], [123]
[123.46], [123]
[19.900000], [1990.000000], [1990], [0], [1084168192]
float + f
test1 :
[0.000000], [0]
[123.456001], [123]
[2147483648.000000], [-2147483648]
test2 :
[0.000000], [0]
[123.456001], [123]
[2147483648.000000], [-2147483648]
test3 :
[0.000000], [0]
[123.456001], [123]
[2147483648.000000], [-2147483648]
test4 :
[123.565002], [123]
[123.463997], [123]
[123.57], [123]
[123.46], [123]
[19.900000], [1990.000000], [1990], [0], [1084168192]
Summary
Point1 double float 隐式转换和显示转换为int,都是直接取整数,同时需要注意溢出
Point2 double类型中19.9这个数字需要特别注意,原因是乘法的计算时采用二进制取整的方式,但是float没有
Point3 注意float初始化存在的精度问题
Refactor
typedef int32_t TAR_TYPE_SIGNED;
typedef uint32_t TAR_TYPE_UNSIGNED;
TAR_TYPE_SIGNED util_double_to_signed_integer(DOUBLE_T _src){
TAR_TYPE_SIGNED max = (~((TAR_TYPE_UNSIGNED)0) / 2);
TAR_TYPE_SIGNED min = -(max) - 1;
if(_src > max){
return max;
}
else if(_src < min){
return min;
}
else{
return (TAR_TYPE_SIGNED)(_src + 0.01);
}
}
TAR_TYPE_SIGNED util_float_to_signed_integer(FLOAT_T _src){
return util_double_to_signed_integer(_src);
}
Thanks For Watching, Have a nice day!