[C][Test]double float -> int转换

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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值