如何将数组初始化为非数字值

时间:2013-04-09 16:26:05

标签: c floating-point

我正在尝试初始化一个数组,以便我可以使用一个简单的if语句来检查一个值是否放入数组中。

这可能吗?

这是我的代码

double number[1024] = {non-numeric value}
int i = 0;
while(1){
    if (number[i] != non-numeric value){

    printf ("%f", number[i]);
    i++;
}
    else
        break;

}

5 个答案:

答案 0 :(得分:8)

要将数据初始化为NaN,请使用NAN

中定义的<math.h>
#include <math.h>

// initialize to all NaNs
for (int i=0; i<1024; ++i) number[i] = NAN;

要检查NaN,请使用isnan

中的<math.h>
if (!isnan(number[i])) {
    // do something if the value isn’t NaN.
}

答案 1 :(得分:2)

使用NAN

中的isnan<math.h>
    #include <stdio.h>
    #include <math.h>

    // ...

    #define N 1024

    double number[N];
    int i;

    for (i = 0; i < N; i++)
        number[i] = NAN; // Produce NaN

    //...    

    i = 0;
    while (i < N)
    {
        if (!isnan(number[i]))
        {
            printf("%f\n", number[i]);
            i++;
        }
        else
            break;
    }

Live code

答案 2 :(得分:1)

试试这个:

double number[1024];
int i = 0;

for(i=0 ; i<1024 ; ++i)
    number[i] = NAN;

// while true is bad programming practice, use a for instead

for(i=0 ; i<1024 ; ++i) {
    if(number[i]!=number[i]) 
        printf("%ld",number[i]);
    else break;
}

答案 3 :(得分:1)

将NaN重新定义为“不是由用户提供”可能是一个坏主意 - 如果用户想要提供NaN会怎么样?

考虑使用“可选”数据结构来表示每个数组元素。

struct optional_double {
    char has_value;
    double value;
};

struct optional_double number[1024];
int i;

memset(number, 0, sizeof(number));

// Populate the array with data here.

for (i = 0; number[i].has_value; ++i) {
    printf("%f", number[i].value);
}

答案 4 :(得分:0)

我的答案与cdhowie相似,但有一个关键的区别。他是对的 - 你不应该将NaN重新定位为“未设置”。 (实际上,设置一些像-1234.56789这样的任意数字比这更安全,因为不太可能有任何东西等于那个,并且更有可能计算会导致NaN。)并且显然,NAN并未在所有math.h中定义。文件,虽然它在你的文件中,但这是最简单的方法。

我建议您为任务重新定位NULL。

你实际上想把你的双倍变成Nullable type,为什么不这样做呢?

double* numberPointers[1024];
memset(numberPointers, NULL, 1024 * sizeof(double));
int i = 0;
while(1){
    if (numberPointers[i] != NULL){
        printf ("%f", numberPointers[i]);
        i++;
    }
    else {
        break;
    }
}

这部分难以改变你的计算。而不是像

那样的东西
void fillArray(double[] number) {
    int i;
    for (i = 0; i < 1024; ++i) {
        number[i] = someCalculation(i);
    }
}

你需要像

这样的东西
void fillArray(double*[] numberPointers) {
    int i;
    double result;
    double* d; 
    for (i = 0; i < 1024; ++i) {
        result = someCalculation(i);
        d = (double*)malloc(sizeof(double));
        *d = result;
        numberPointers[i] = d;
    }
} 

当然,当你完成后,你需要free numberPointers中的所有指针,但这应该很容易:

int i;
for (i = 0; i < 1024; ++i) {
    if (numberPointers(i) != NULL) {
        free(numberPointers(i));
    }
}