C Проверка или преобразование показателей - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть показатели в представленном формате: «1.45e004» или «1.45e-04» или «-1.45e004».

[обратите внимание на знак минус в третьем]

Проверка (==,! =,>, <, <=,> = И т. Д.) Не работает на показателях [неверноили результаты не возвращаются] в их текущем формате.

Однако , преобразование экспоненты с использованием fabs работает для первых двух, но не для последнего, так как fabs удаляет знак минус (ergoсделать значение положительным, а не отрицательным, как это должно быть).

Мои вопросы, таким образом:

1) Есть ли способ преобразовать показатели в абсолюты, которые включаютзначения со знаком?

[fabs не может этого сделать]

ИЛИ

2) Есть ли способ [или функция (и)] сравнить одинпоказатель степени к другому (должен уметь делать ==,! =,>, <,> =, <=)? </p>

ИЛИ

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) Прямое сравнение с использованием AWkward обойти, сравнив два числа в показателе степени отдельно.

[Детали фона]

Фактическая программа охватывает 7 заголовочных файлов и 1 cpp, поэтому я не могу отобразить определенный сегмент, поскольку он переплетен.

Задача такова: файлы, загруженные со спутника ACE, анализируются как аргументы, загружаются в память, преобразуются в соответствующие им типы.Затем сохраненные типы сортируются и подготавливаются (текущий этап) для визуализации графика (еще не реализовано).

В данный момент я имею дело с показателями (хранятся в спутниковых текстовых файлах ACE в формате, указанном выше.).Эти показатели необходимо просмотреть, чтобы найти наибольший показатель и наименьший показатель, чтобы график можно было правильно распределить между ними.После этого каждый показатель будет сравниваться, чтобы определить, больше ли он (выше на графике) или меньше (ниже на графике) заданного набора чисел.

Для этой задачи мне нужно сравнение между показателями,Поскольку я неопытен с ними, я решил спросить здесь.

Ответы [ 4 ]

2 голосов
/ 13 апреля 2011

Непонятно, почему вы звоните 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 голосов
/ 13 апреля 2011

Кажется, вам нужно прочитать Что должен знать каждый учёный об арифметике с плавающей точкой , чтобы хотя бы помочь вам с лексикой.

Возможно, вы можете вычислить показатель степени, используя

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

Ваш вопрос сложен для понимания, он недостаточно четко определен, что означает "проверить" число с плавающей запятой, что вы пытаетесь определить?

ОБНОВЛЕНИЕ: Чтобы сравнить цифры, просто сделайте это.Все ваши три значения выборки являются просто допустимыми числами с плавающей запятой и могут сравниваться напрямую с помощью стандартных встроенных операторов.

0 голосов
/ 13 апреля 2011

В этом примере вы должны найти то, что ищете:

#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;
}
0 голосов
/ 13 апреля 2011

Я думаю, что вы хотите сделать, это извлечь коэффициент и base части из числа, выраженного в научной нотации. Для этого нет стандартной библиотечной функции, но вы можете написать ее легко:

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
...