首先,我的上下文是需要将浮点文字(字符串)转换为浮点值/双精度值的编译器编写者的上下文。我在过去的15年里没有做过任何浮点编程,所以我很确定这是一个愚蠢的新手问题。
double res;
errno=0;
*res = strtod((const char*)literal,NULL);
if (errno==ERANGE) throw_a_literal_out_of_range_exception();
return res;但是c运行时库中没有"strtof“函数吗?
编辑:澄清。我已经知道字符串'literal‘是一个有效的C浮点模式。它已经通过了正则表达式测试。我只想检查是否存在范围/精度问题。
原因是用户可以在Eiffel源代码中编写
a := {REAL_32} 3.1415
b := {REAL_32} 3.0E200将写入的浮点数explit转换为32位浮点。我认为在第二种情况下,编译器应该检测到值超出范围,并抛出一个错误或至少一个警告。
发布于 2009-12-22 18:12:31
因为您的值在double中,所以可以检查它是否在float的范围之外
#include <stdlib.h>
#include <stdio.h>
#include <float.h>
int main(int argc, char *argv[])
{
double d = FLT_MAX;
if (argc > 1) {
d = strtod(argv[1], NULL);
}
if ((d > 0 && (d > FLT_MAX || d < FLT_MIN))
|| (d < 0 && (d < -FLT_MAX || d > -FLT_MIN)))
printf("Invalid float: %g\n", d);
else
printf("Valid: %g\n", d);
return EXIT_SUCCESS;
}运行程序:
$ ./a.out
Valid: 3.40282e+38
$ ./a.out 3.5e38
Invalid float: 3.5e+38
$ ./a.out -1e40
Invalid float: -1e+40您可能需要也可能不需要添加测试以确保正确的strtod()返回,这取决于double类型中是否也存在溢出的可能性。
发布于 2009-12-20 18:57:07
在C89中,你可以使用sscanf。
例如:
float myfloat;
if(sscanf(str, "%f", &myfloat) != 1)
/* String could not be converted */
else
/* String was converted, myfloat is usable */发布于 2009-12-20 23:06:02
@Nicholas Goy:我不认为sscanf(str, "%f, &float) == 1 (或!= 1)真的做了想要的事情。
如果str中有其他字符(例如"1.1foo"),它将正确解析,这可能不是我们所希望的。可以通过执行以下操作来纠正此问题:
char dummy;
if (sscanf(str, "%f%c", &float, &dummy) != 1) {
/* Parse error. */
} else {
/* Parsed cleanly. */
}而不是。但是,带有%f的sscanf可能会在内部使用strtod,并强制转换为浮点型。C标准中的语言说:
strtod a、e、f、g匹配可选的有符号浮点数、无穷大或NaN,其格式与
函数的主题序列的预期格式相同。相应的参数应该是指向浮点的指针。
这在某种程度上意味着这一点,对我来说似乎是真的(FreeBSD上的gcc 4.2.1 )。使用上面的sscanf代码,"1.79e308“成功解析,但值为+inf,"5e-300”的值为0.0,这些结果与您从(float) 1.79e308和(float) 5e-300获得的结果相同。
不管怎么说。话虽如此,我质疑为什么操作要使用浮点数而不是双精度。
https://stackoverflow.com/questions/1935501
复制相似问题