我的代表格式是:“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卫星文本文件中)。需要扫描这些指数以找到最大指数和最小指数,因此图形可以在两者之间正确间隔。在此之后,将对每个指数进行比较,以查看它是否更大(在图表上更高)或小于(在图表上更低)给定的一组数字。
对于这项任务,我需要在指数之间进行比较。鉴于我对他们缺乏经验,我决定在这里问。
答案 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;
}