json-tutorial icon indicating copy to clipboard operation
json-tutorial copied to clipboard

c++ std::stod() 精度与C的strtod()不一致?

Open Zjianglin opened this issue 8 years ago • 2 comments

我尝试用C++重新写一遍教程,但是在解析JSON数字的时候, 使用std::stod()会在一些类似 1e-1000(underflow), 4.9406564584124654-e324 这样的数字上抛出std::out_of_range 的错误, 那如果C++写的话要和C实现的解析精度一样除了使用C标准库的strtod 还有没有别的方法? 还是说 像类似1e-1000(underflow), 4.9406564584124654-e324 这样的数字解析是不是应该返回 LEPT_PARSE_NUMBER_TOO_BIG

Zjianglin avatar Feb 09 '17 06:02 Zjianglin

解析精度应该一样啊,因为std::stod()内部就是调用了strtod。 参考 抛出异常和使用错误码,不过是C++和C两种不同的处理方式。std::stod()把strtod中的错误码,包装成了异常,你去捕获异常,然后返回LEPT_PARSE_NUMBER_TOO_BIG就行了。

ShuhuaGao avatar Oct 21 '17 05:10 ShuhuaGao

另外,发现,如果不包含 <stdlib.h>的时候,也能够编译执行,但是,strtod 函数的返回值是有问题的。 ***c->json=[0], v->n=[0.000000] ***c->json=[-0], v->n=[1.000000] ***c->json=[-0.0], v->n=[1.000000] ***c->json=[1], v->n=[0.000000] ***c->json=[-1], v->n=[0.000000] ***c->json=[1.5], v->n=[0.000000] ***c->json=[-1.5], v->n=[0.000000] ***c->json=[3.1416], v->n=[0.000000] ***c->json=[1E10], v->n=[0.000000] ***c->json=[1e10], v->n=[0.000000] ***c->json=[1E+10], v->n=[0.000000] ***c->json=[1E-10], v->n=[0.000000] ***c->json=[-1E10], v->n=[0.000000] ***c->json=[-1e10], v->n=[0.000000] ***c->json=[-1E+10], v->n=[0.000000] ***c->json=[-1E-10], v->n=[0.000000] ***c->json=[1.234E+10], v->n=[0.000000] ***c->json=[1.234E-10], v->n=[0.000000] ***c->json=[1e-10000], v->n=[-1009459056.000000]

cshuazhang avatar Jul 18 '18 02:07 cshuazhang