- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 Microsoft Visual Studio 2012 中构建一个应用程序,并且有一个接受 char 数组的函数,并且应该返回一个单精度 float 。
我的功能:
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 */
}
我想检查浮点值与 float 据类型的最大值和最小值的比较,并且我还需要检查字符数组的长度。
我期望的输出如下:
如果我传入:
1.999999999999999911111111111111111111111111111111111111111111111111111111111111111
我期望得到:2.000000
如果我传入:
999999999999999999999999999999999999999999999999999999999999999999999999999999999.0
我期望得到:99999999999999999999
如果我传入:
0.00000000000000000000000000000000000000000000000000000000000000000000000000000000001
我期望得到:0.000000000000000000
有谁知道我如何才能取得这样的结果,或者至少为我指出正确的方向?谢谢!
编辑
对于第一种情况,结果2.000000
由32位 float 表示。另外两个结果只是字符串 lexeme
被截断为前 20 个字符。总而言之,如果 lexeme
表示有效的 float
,则它表示为 float ,但如果 lexeme
表示无效的 float
(超出范围、小数点后缺少数字等),那么 lexeme
的前 20 个字符就是我返回的内容(不是实际的 float
)。
最佳答案
您可能想读一下:What Every Computer Scientist Should Know About Floating-Point Arithmetic
具体来说,您不会从浮点类型(甚至从 double 类型)中获得“99999999999999999999”或 20 位精度。其次,根据您如何转换值,您可能会得到“0.000000000000000000000000000000000000000000000000000000000000000000000000000000000001”的1E-83。您可能还想看看IEEE Floading Point
您的示例与您的目标不符,这表明其中一个都会导致失望。如果需要将字符串转换为 32 位浮点类型,则需要遵守该格式的限制。如果您需要示例描述的精度(和行为),您可能需要编写某种自定义数字类型。
关于c - 如何将 char 数组转换为 float 并检查其范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613904/
我是一名优秀的程序员,十分优秀!