描述问题
用宏实现的round, floor, ceil是有问题的。floor和ceil里面的数字精度不够,比如tb_ceil(1e-15) == 0。而round里面的x+0.5对于0.49999999999999994在默认舍入模式下也会给出错误的结果:tb_round(0.49999999999999994) == 1。
实际上c标准规定的floor, ceil, round是不受浮点环境而改变的,用宏写的加减法是会受到浮点环境影响的。
另外tbox里面没有包含的<math.h>里面rint系列函数,c标准里面它们是会受到浮点环境而改变的。
总之手写一个符合标准的舍入函数还是很不容易的,建议还是转发到标准库的实现吧。
描述问题
用宏实现的
round, floor, ceil是有问题的。floor和ceil里面的数字精度不够,比如tb_ceil(1e-15) == 0。而round里面的x+0.5对于0.49999999999999994在默认舍入模式下也会给出错误的结果:tb_round(0.49999999999999994) == 1。实际上c标准规定的
floor, ceil, round是不受浮点环境而改变的,用宏写的加减法是会受到浮点环境影响的。另外tbox里面没有包含的
<math.h>里面rint系列函数,c标准里面它们是会受到浮点环境而改变的。总之手写一个符合标准的舍入函数还是很不容易的,建议还是转发到标准库的实现吧。