Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将字符数组转换为浮点并检查其范围?_C_Arrays_String_Floating Point - Fatal编程技术网

C 如何将字符数组转换为浮点并检查其范围?

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

我正在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(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
的情况下,我期望的结果实际上是浮点值的字符串表示,而不是实际的浮点值。