0

我有表示格式的指数:“1.45e004”或“1.45e-04”或“-1.45e004”。

[请注意第三个中的减号]

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

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

我的问题是:

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

[晶圆厂无法做到这一点]

或者

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

或者

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

例如:“-1.45e-04”[值 1 = -1.45,值 2 = -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

4 回答 4

2

看来您需要阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic,至少可以帮助您掌握词汇量。

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

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

您的问题很难理解,“检查”浮点数的含义并没有明确定义,您要确定的是什么?

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

于 2011-04-13T09:28:53.843 回答
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");
}
于 2011-04-13T09:43:31.650 回答
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
于 2011-04-13T09:51:53.157 回答
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;
}
于 2011-04-13T09:54:51.177 回答