C检查或转换指数

时间:2011-04-13 09:15:41

标签: c++ c exponent

我的代表格式是:“1.45e004”或“1.45e-04”或“-1.45e004”。

[请注意第三个减号]

检查(==,!=,>,<,< =,> =等)不适用于当前格式的指数[不正确或未返回结果]。

然而,使用fabs转换指数适用于前两个,但不是最后一个,因为fabs删除减号(ergo使值为正,而不是负值)。

我的问题是:

1)有没有办法将指数转换为包含有符号值的绝对值?

[fabs不能这样做]

OR

2)有没有办法[或函数]将一个指数与另一个指数进行比较(必须能够做到==,!=,>,<,> = ,< =)?

OR

3)有没有办法从指数中提取两个值。

EG:“ - 1.45e-04”[Value1 = -1.45,Value2 = -4]。

问题的答案 1 和/或 2 是非常优选的,因为3是一个解决方案可能会遇到实施问题(但是,它是在案例1和2没有任何合适的答案)。

[侧注:可以使用C ++方法,但首选避免使用流]

谢谢

int main(void)
{
    //Not the actual program, but simple enough
    char Arr[100];
    double T1, T2;

    sprintf(Arr,"-1.45e004");
    T1 = atof(Arr);

    printf("%f\n",fabs(T1)); //Fails to show the minus sign

    return 0;
}

可以实现总体目标,因此可以回答以下三个问题中的任何一个:

或者: 1)在给定格式的两个指数之间直接比较(使用函数),以查看它们是否相同,不同,更大,小于(等),用于将最大指数排序到最小指数(未包含在实现排序的程序是不相关的:只需要解决检查。

2)间接比较,将其转换为可直接比较的另一种类型。

3)通过分别比较指数中的两个数字,使用笨拙的工作进行直接比较。

[背景细节]

实际程序跨越7个头文件和1个cpp,因此我无法显示特定的段,因为它是交织在一起的。

因此,任务是:从ACE卫星下载的文件被解析为参数,加载到内存中,转换为适当的类型。然后对存储的类型进行排序和准备(当前阶段)以呈现图形(尚未实现)。

目前,我正在处理指数(以上面给出的格式存储在ACE卫星文本文件中)。需要扫描这些指数以找到最大指数和最小指数,因此图形可以在两者之间正确间隔。在此之后,将对每个指数进行比较,以查看它是否更大(在图表上更高)或小于(在图表上更低)给定的一组数字。

对于这项任务,我需要在指数之间进行比较。鉴于我对他们缺乏经验,我决定在这里问。

4 个答案:

答案 0 :(得分:2)

您似乎需要阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic,至少可以帮助您学习词汇。

也许您可以使用以下方法计算指数:

const double exp = log(value) / log(10.0);

你的问题很难理解,它没有明确定义“检查”浮点数是什么意思,你试图确定什么?

更新:要比较数字,请执行此操作。您的所有三个样本值都只是合法的浮点数,可以使用标准的内置运算符直接进行比较。

答案 1 :(得分:2)

目前还不清楚为什么你在这一行中呼叫fabs()

printf("%f\n",fabs(T1)); //Fails to show the minus sign

这就是fabs()所做的,它使得负数正。也许你想要这个:

printf("%f\n",T1);

可以直接比较两个浮点数:

double x = 12.345e67;
double y = 6.543e-2;
if (x > y) {
    puts("x is greater than y");
}

答案 2 :(得分:0)

我认为您要做的是从科学计数法表示的数字中提取系数基础部分。没有标准的库函数可以执行此操作,但您可以轻松编写一个:

static int
extract_coeff_and_base (double d, char *coeff, char *base)
{
  char buffer[50];
  size_t i;
  size_t len;

  sprintf (buffer, "%E\n", d);
  len = strlen (buffer);
  i = strcspn (buffer, "E");
  if (i < len)
    {
      memcpy (coeff, buffer, i);
      coeff[i] = 0;
      memcpy (base, buffer + i + 1, len - i);
      base[len - i] = 0;
      return 0;
    }
  return 1;
}

用法:

int
main (int argc, char **argv)
{
  double d = atof (argv[1]);
  char coeff[20];
  char base[20];

  if (extract_coeff_and_base (d, coeff, base) == 0)
    {
      printf ("coefficient=%s, base=%s\n", coeff, base);
    }
  return 0;
}

试验:

$ ./test.exe 1.45e004
coefficient=1.450000, base=+04

$ ./test.exe 1.45e-04
coefficient=1.450000, base=-04

$ ./test.exe -1.45e004
coefficient=-1.450000, base=+04

答案 3 :(得分:0)

您应该在此示例中找到您要查找的内容:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

const char *nums[] = {"1.45e004", "1.45e-04", "-1.45e004", NULL};

int main() {
  const char **numstring = nums;
  while (*numstring != NULL) {
    double num = strtod(*numstring, NULL);
    double sign = copysign(1.0, num);
    double exponent = trunc(log10(sign * num));
    double mantissa = num / pow(10, exponent);
    printf("%s -> %g, mantissa=%f, exponent=%f\n", *numstring, num, mantissa, exponent);
    numstring++;
  }
  return 0;
}