C 如何将字符数组转换为浮点并检查其范围?
我正在Microsoft Visual Studio 2012中构建一个应用程序,我有一个接受字符数组的函数,应该返回一个单精度浮点数 我的职能:C 如何将字符数组转换为浮点并检查其范围?,c,arrays,string,floating-point,C,Arrays,String,Floating Point,我正在Microsoft Visual Studio 2012中构建一个应用程序,我有一个接受字符数组的函数,应该返回一个单精度浮点数 我的职能: Token aa_func08(char lexeme[]){ Token t; /* floating point literal Token to be returned */ double temp; /* floating point value of character array */ temp = atof(l
Token aa_func08(char lexeme[]){
Token t; /* floating point literal Token to be returned */
double temp; /* floating point value of character array */
temp = atof(lexeme); /* convert character array to floating point value */
if ((FLT_MAX - temp <= FLT_EPSILON) || (temp - FLT_MIN <= FLT_EPSILON)) /* floating point value is outside the accepted range */
return aa_table[ES](lexeme); /* return an error Token */
t.code = FPL_T; /* set Token code */
t.attribute.flt_value = (float)temp; /* set Token integer value to floating point literal value */
return t; /* return floating point literal Token */
}
我希望得到:2.000000
如果我通过:
1.999999999999999911111111111111111111111111111111111111111111111111111111111111111
999999999999999999999999999999999999999999999999999999999999999999999999999999999.0
0.00000000000000000000000000000000000000000000000000000000000000000000000000000000001
我希望得到:999999999999999
如果我通过:
1.999999999999999911111111111111111111111111111111111111111111111111111111111111111
999999999999999999999999999999999999999999999999999999999999999999999999999999999.0
0.00000000000000000000000000000000000000000000000000000000000000000000000000000000001
我希望得到:0.000000000000000000000000
有谁知道我如何才能取得这样的结果,或者至少为我指明了正确的方向?谢谢大家!
编辑
对于第一种情况,结果
2.000000
由32位浮点表示。另外两个结果只是字符串lexeme
被截断为前20个字符。总之,如果lexeme
表示有效的float
,则表示为float,但如果lexeme
表示无效的float
(超出范围,小数点后缺少数字等),则lexeme
的前20个字符是我返回的(不是实际的float
).您可能需要阅读以下内容:
具体来说,您不会从浮点类型(甚至双精度)中获得“99999999999999”或20位精度。第二,取决于您如何转换“0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001”的值,您可能会得到1E-83。您可能还想看看
你的例子与你的目标不符,表明其中一个会导致失望。如果需要将字符串转换为32位浮点类型,则需要遵守该格式的限制。如果您需要示例中描述的精度(和行为),您可能需要编写某种自定义数字类型。看起来OP的目标是通过使用字符串到
双精度转换,然后测试限制,检查数字是否符合浮动范围
极限测试无效。错误使用FLT\u EPSILON
和FLT\u MIN
建议将double
与+/-FLT_MAX进行简单比较
volatile double d = atof(lexeme);
if ((d > FLT_MAX) || (d < -FLT_MAX)) {
return aa_table[ES](lexeme);
}
t.code = FPL_T;
t.attribute.flt_value = (float) d;
极限测试仍然有意义,因为输入可以是代码> 1.0E100,或者超出<代码> FLTMXMAX
什么是<代码> FLTMXMAX和<代码> FLTMIN < /代码>?我会考虑查看sSCANF。还可以查看@Code学徒,它们是float.h中定义的最大和最小浮点值的常量。与预期值相比,您得到了什么?对于案例1和案例3,我得到了您的预期结果。对于案例2,我得到+INF,因为它超过了FLT#u MAX。您对案例2的预期输出没有意义。您确实了解float
和double
之间的区别以及两者固有的不精确性吗?@uesp我忘了澄清案例1由float
表示,但是案例2和案例3只是lexeme
被截断为20个字符。你的变量f来自哪里?@Benjamin C.Huskisson Snider抱歉,f
是先前答案中留下的。答案更新了,我意识到了。基本上,在999999999999999999
和0.000000000000000000
的情况下,我期望的结果实际上是浮点值的字符串表示,而不是实际的浮点值。