如何在C中使用NAN填充int / size_t的向量/矩阵

klr1opcd  于 2023-03-07  发布在  其他
关注(0)|答案(1)|浏览(135)

据我所知,NAN可以分配给double类型变量,但不一定分配给int/size_t
是否还有方法使用NAN填充int/size_t类型的向量/矩阵?

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

typedef struct {
  size_t nrows, ncols;
  size_t *array;
} Matrix ;

size_t ncol = 5;
size_t nrow = 1;

void print_matrix(Matrix * matrix);

int main()
{
  Matrix *mat1 = (Matrix *) malloc(sizeof(Matrix));
  mat1->nrows = nrow;
  mat1->ncols = ncol;
  mat1->array = (size_t *) malloc(mat1->nrows * mat1->ncols * sizeof(*mat1->array));
  if (mat1 == NULL)
  {
    printf("Could not allocate memory\n");
    exit(EXIT_FAILURE);
  }
  else
  {
    mat1->nrows = nrow;
    mat1->ncols = ncol;
    mat1->array = (size_t *) malloc(mat1->nrows * mat1->ncols * sizeof(*mat1->array));
    for (size_t row =0; row<mat1->nrows; row++)
    {
      for (size_t col =0; col<mat1->ncols; col++)
      {
        mat1->array[row * ncol + col] = NAN;
      }
    }
    print_matrix(mat1);
    free(mat1);
  }
}

void print_matrix(Matrix * matrix)
{
  for (size_t row =0; row<matrix->nrows; row++)
  {
    for (size_t col =0; col<matrix->ncols; col++)
    {
      printf("%zu ", matrix->array[row * ncol + col]);
    }
    printf("\n");
  }
}
5kgi1eie

5kgi1eie1#

据我所知,NAN可以[赋值]给double类型变量
正确。NaN是为基于IEEE-754的类型(如floatdouble)定义的特殊值之一。1
但不一定是int/size_t
正确。NaN * 不是 * 为整型intsize_t定义的值。
你不能把NaN存储在整型变量中,原因和你不能把3.14存储在整型变量中一样,只是它不是整型类型可以保存的值之一。
(One在编程中,data type的正式定义之一是它是一组值,以及对这些值的一组操作。对于floatdouble类型(但仅限于这些类型),NaN是其中一个值。实际上,有多个NaN值,但那是另一回事。)
对于浮点类型,NaNsentinel values,定义良好的“非值”值。有些类型有标记值,有些没有。例如,对于指针类型,NULL是标记“非有效指针”值。在C字符串中,空字符\0是标记字符串结束的标记值。另一方面,当你调用getchar时,EOF是“非字符”值(但是这并没有使EOF成为char类型的标记值,因为EOF不是char类型的值)。
但是对于任何其他整型类型,都没有预定义的标记值,就像在真实的程序中使用整型一样,没有一个值可以保留为标记,而这个值可能不是有效值。
如果你有一个整型变量,并且你需要一个标记值,你需要定义一个你自己的标记值。例如,如果你知道你的值总是正的,你可以使用-1作为标记值。但这充其量只是一个约定:值-1不会被语言或CPU特殊处理--它只是另一个整数值。
浮点和指针类型有标记值是件好事,而其他类型没有标记值有时会很麻烦。当试图为其他类型定义标记值时,必须使用的 ad hoc 约定经常会导致各种麻烦。为了使EOF作为getchar的标记值,程序员必须记住always store getchar 's return value in a variable of type int。而不是char。像read这样的函数返回读取的字符数,或者返回-1表示错误,很难为其定义一个好的返回类型,因为它必须有符号才能容纳-1,否则可能是无符号的。2函数mktime将分解的时间结构转换回整数time_t值,对于错误,返回-1,这意味着您无法明确地判断是否出现错误,或者是否成功转换了1969年12月31日23:59:59的时间。
脚注1:类型floatdouble并不一定基于C语言中的IEEE-754定义,但在当今的大多数系统上,它们都是。
脚注2:我相信这就是为什么read被定义为返回ssize_t类型的值,并且我相信ssize_t类型是“有符号的size_t“,或者换句话说,“一个本来是无符号的值,就像size_t一样,除了它必须有符号才能返回-1”。

相关问题