如何测试数字是否存在科学记数法?

时间:2011-09-21 06:34:17

标签: c linux numbers validation

如何测试存储为字符串的数字是否为指数(在Linux中)?

我可以使用扫描数字和查找是否存在'e'等方法,但我需要一种更聪明的方法来查找。

是否存在任何API可以快速查找并判断它是否为指数数字?

我可以使用蛮力方法,例如搜索整个字符串,然后获得一个'e',然后是+/-,然后是一个数字。但我需要一种更快捷,更智能的方式,这样可以减少机器周期。

P.S:指数数字是这样的数字:43e4,23e-2(任何数字之间都有e

6 个答案:

答案 0 :(得分:4)

指数不存在。存储在floatdouble中的数字对于输入0.011E-2具有相同的位模式。数字也不存储在字符串中。字符串存储在字符串中。因此,如果将数字转换为字符串,则可以隐式或显式选择某个转换。在转换之后,您只使用数字的表示,而不是数字本身。

如果您的转换选择将数字0.1转换为字符串"1E-1""0.1""10^-1",那么它将使用您的定义 - 只有一个指数数字这三个案子?这只有在非常有趣的场景才有意义,所以请退后一步思考,真正的问题是什么。

答案 1 :(得分:3)

regex_t re;
regcomp(&re, "^([0-9]+[.]?[0-9]*|[0-9]*[.][0-9]+)[eE][+-]?[0-9]+$", REG_EXTENDED);
if (!regexec(&re, str, 0, 0, 0)) /* It's an "exponential number" */

答案 2 :(得分:1)

我假设给定一个已知可解析为字符串的字符串,您想知道它是否采用科学记数法,即其中有e

使用标准库的strchr功能是否足够聪明?

char *num_str = "43e4";

if (strchr(num_str, 'e'))
{
    /* It's in scientific notation! */
    ...
}

更多strchr文档: http://www.gnu.org/software/libc/manual/html_node/Search-Functions.html#index-strchr-549

答案 3 :(得分:1)

看看lex(或flex)。

我用来识别科学记数字的规则如下:

{DIGIT}*\.{DIGIT}+[eE][+-]?{DIGIT}+  |
{DIGIT}+\.{DIGIT}*[eE][+-]?{DIGIT}+  |
{DIGIT}+[eE][+-]?{DIGIT}+

DIGIT定义为:

DIGIT       [0-9]

答案 4 :(得分:1)

我没有看到做strchr(数字,'e')或strchr(数字,'E')以检查你是否有科学记数法会出错。为了防止kingsmasher1解释的问题,你应该检查sscanf是否接受该字符串是有效的。

另一种方法(未测试)可能是使用“%f”和“%g”(“%e”)比较sscanf的结果。 请注意,e可能显示为小写或大写字母。

答案 5 :(得分:1)

第1步:要检查字符串是否可以解释为double,只需使用strtod然后检查endptr

double strtod(const char *nptr, char **endptr);

第2步:我怀疑是否存在预先存在的API,用于检查表示为字符串的浮点数是否包含显式指数。但是,这是一项微不足道的任务,我认为你应该简单地编写自己的函数。

int has_exp(const char* s) {
  while (*s != 0) {
    if (*s == 'e' || *s == 'E') return 1;
    s++;
  }
  return 0;
}