【发布时间】:2015-04-16 13:16:09
【问题描述】:
我需要解析一个用科学记数法表示的给定类型(例如:long long integer)。示例:
123456789012345678.3e-3
123456789012345678.3
我知道给定字符串的类型,但我不能使用 strtoll,因为数字是以科学记数法给出的。我所做的是使用 strtod 对其进行转换,对 int64_t 进行错误检查并将其转换回 int64_t。 ErrCheckInt 和 ErrCheckDouble 对整数和浮点类型进行错误检查(上溢、下溢等),并将数字转换为任何类型。 .
double res = strtod(processedStr, &end);
return (std::is_floating_point<OUT_T>::value) ? ErrCheckFloat<double, OUT_T>(res, out) : ErrCheckInt<double, OUT_T>(res, out);
问题是当我用 double 解析 int64_t 时,我得到一个具有正确科学记数法的浮点数,1 位有效数。当我再次将数字转换为 int64_t 时,我失去了精度。示例编号:
input: 123456789012345678.3
double_converted: 1.23456789012346E+17
cast_to_int64_t: 123456789012345680
expected: 123456789012345678
我知道这个数字足够长,可以用双精度正确表示。我可以使用 long double 但这不能解决问题。
最后我可以评估字符串并删除/添加与 e 符号相关的数字,但处理应该非常非常快,因为代码将在嵌入式 rtos 中运行。我已经做了很多检查,strtod 也会花时间。
【问题讨论】:
标签: c++ floating-point type-conversion floating-accuracy