c - float 的三向比较

标签 c floating-point comparison-operators

<分区>

给定一对 float ,执行三向比较的最佳方法是什么,即返回负数、零或正数,具体取决于第一个数是小于、等于还是大于第二个数字?

一些语言,如 Perl、Java 和 C++20,内置了这个运算符,或者在标准库中。但是,我问的是如何在纯 C 中执行此操作。

如果输入是整数,编写一对双向比较将是一件简单的事情。但相比之下,由于 NaN 的特殊行为,浮点输入更加复杂。考虑到这一点,这样做的合适方法是什么?

最佳答案

What's the appropriate way to do it, taking that (NAN) into account?

返回一个 FP 类型以允许 4 个不同的返回值:-1.0、0.0、1.0、NAN。

在涉及 -0.0 的特定情况下,下面还会返回 -0.0。

#include <math.h>

double fcmp(double a, double b) {
  if (isunordered(a, b)) return NAN;
  if (a > b) return 1.0; 
  if (a < b) return -1.0; 
  return a - b;
} 

我什至会考虑传播 ab 当一个是 NAN 以维护 NAN 负载。可能存在许多不同的非 a 数。

double fcmp(double a, double b) {
  if (isnan(a)) return a;
  if (isnan(b)) return b;
  ...
} 

但让我们看一下用于排序的 3 路,如 qsort()。问题是将 NAN 放在哪里?一个共同的目标是将它们放在列表的最后 - 即所有 NAN 都比其他的大。为此,我们需要一致地比较,即使两个操作数都是具有不同有效负载的 NAN。

// All NAN considered greater than others
// return 0, a positive or negative int.
int fcmp_for_qsort(const void *ap, const void *bp) {
  double a = *(const double *) ap;
  double b = *(const double *) bp;
  if (isnan(a)) {
    if (isnan(b)) {
      return 0;
    }
    return 1;
  }
  if (isnan(b)) -1;
  return (a > b) - (a < b);
} 

关于c - float 的三向比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70363850/

相关文章:

c - 了解 Linux 内核中每个 cpu 的结构

c++ - NCURSES:创建没有循环的标题栏

matlab - 在 MATLAB 中,给定一些十进制数,有什么有效的方法可以找到自定义浮点二进制的尾数和指数的最小长度?

python - 小于或大于 Python 中作为变量的比较

c++ - 如何为指向类的指针重载 operator==() ?

c - 在 printf 中发布增量和指针

c - 使用字符数组作为模块的输入来扫描 C 中的文件

python - 截断 f 字符串 float 而不舍入

java - 哪种方法更准确?

javascript - "is x greater than y and less than z"的表达式?