命名空间
变体
操作

remquo、remquof、remquol

来自 cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
类型
(C99)(C99)    

(C99)(C99)    

函数
基本操作
remquo
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大值/最小值操作
(C99)
(C23)    
指数函数
(C23)
(C99)
(C99)
(C23)
(C23)
(C99)
(C99)(C23)
(C23)
(C23)
幂函数
(C99)
(C23)
(C23)
(C99)
(C23)
(C23)
三角函数和双曲函数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
误差和伽马函数
(C99)
(C99)
(C99)
(C99)
最接近整数的浮点运算
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮点操作函数
(C99)(C99)
(C99)(C23)
(C99)
缩窄操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子和量子指数函数
十进制重新编码函数
全序和有效载荷函数
分类
(C99)
(C99)
(C99)
(C23)
宏常量
特殊浮点值
(C99)(C23)
参数和返回值
(C99)(C99)(C99)(C99)(C99)    
错误处理
(C99)    

 
定义在头文件 <math.h>
float       remquof( float x, float y, int *quo );
(1) (自 C99)
double      remquo( double x, double y, int *quo );
(2) (自 C99)
long double remquol( long double x, long double y, int *quo );
(3) (自 C99)
定义在头文件 <tgmath.h>
#define remquo( x, y, quo )
(4) (自 C99)
1-3) 计算除法运算 x/y 的浮点余数,如同 remainder() 函数一样。此外,x/y 的符号和至少最后三位将被存储在 quo 中,足以确定结果在周期内的八分之一。
4) 类型通用宏:如果任何非指针参数的类型为 long double,则调用 remquol。否则,如果任何非指针参数的类型为整数类型或 double,则调用 remquo。否则,调用 remquof

内容

[编辑] 参数

x, y - 浮点值
quo - 指向一个整数值的指针,用于存储 x/y 的符号和一些位

[编辑] 返回值

如果成功,则返回除法 x/y 的浮点余数,如 remainder 所定义,并将 x/y 的符号和至少三位最低有效位存储在 *quo 中(正式地,存储一个值,其符号为 x/y 的符号,其大小与 x/y 的整数商的大小模 2n
一致,其中 n 是一个大于或等于 3 的实现定义的整数)。

如果 y 为零,则存储在 *quo 中的值是不确定的。

如果出现域错误,则返回一个实现定义的值(支持 NaN 时返回 NaN)。

如果由于下溢出现范围错误,则在支持次正规数时返回正确的结果。

如果 y 为零,但没有出现域错误,则返回零。

[编辑] 错误处理

错误报告方式如 math_errhandling 中所述。

如果 y 为零,可能会出现域错误。

如果实现支持 IEEE 浮点运算(IEC 60559),则

  • 当前的舍入模式没有影响。
  • FE_INEXACT 永远不会被触发。
  • 如果x 是 ±∞ 且 y 不是 NaN,则返回 NaN,并触发 FE_INVALID
  • 如果y 是 ±0 且 x 不是 NaN,则返回 NaN,并触发 FE_INVALID
  • 如果 xy 是 NaN,则返回 NaN。

[编辑] 备注

POSIX 要求 如果 x 是无穷大或 y 为零,则会发生域错误。

当实现周期为浮点数可精确表示的周期函数时,此函数很有用:当计算 sin(πx) 对于非常大的 x 时,直接调用 sin 可能会导致很大的误差,但如果首先使用 remquo 减少函数参数,则商的低位可以用来确定结果在周期内的符号和象限,而余数可以用来高精度计算值。

在某些平台上,此操作由硬件支持(例如,在 Intel CPU 上,FPREM1 在商中保留了精确的 3 位精度)。

[编辑] 示例

#include <fenv.h>
#include <math.h>
#include <stdio.h>
 
#ifndef __GNUC__
#pragma STDC FENV_ACCESS ON
#endif
 
double cos_pi_x_naive(double x)
{
    const double pi = acos(-1);
    return cos(pi * x);
}
 
// the period is 2, values are (0;0.5) positive, (0.5;1.5) negative, (1.5,2) positive
double cos_pi_x_smart(double x)
{
    const double pi = acos(-1);
    int extremum;
    double rem = remquo(x, 1, &extremum);
    extremum = (unsigned)extremum % 2; // keep 1 bit to determine nearest extremum
    return extremum ? -cos(pi * rem) : cos(pi * rem);
}
 
int main(void)
{
    printf("cos(pi * 0.25) = %f\n", cos_pi_x_naive(0.25));
    printf("cos(pi * 1.25) = %f\n", cos_pi_x_naive(1.25));
    printf("cos(pi * 1000000000000.25) = %f\n", cos_pi_x_naive(1000000000000.25));
    printf("cos(pi * 1000000000001.25) = %f\n", cos_pi_x_naive(1000000000001.25));
    printf("cos(pi * 1000000000000.25) = %f\n", cos_pi_x_smart(1000000000000.25));
    printf("cos(pi * 1000000000001.25) = %f\n", cos_pi_x_smart(1000000000001.25));
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    int quo;
    printf("remquo(+Inf, 1) = %.1f\n", remquo(INFINITY, 1, &quo));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID raised");
}

可能的输出

cos(pi * 0.25) = 0.707107
cos(pi * 1.25) = -0.707107
cos(pi * 1000000000000.25) = 0.707123
cos(pi * 1000000000001.25) = -0.707117
cos(pi * 1000000000000.25) = 0.707107
cos(pi * 1000000000001.25) = -0.707107 
remquo(+Inf, 1) = -nan
    FE_INVALID raised

[编辑] 参考资料

  • C23 标准 (ISO/IEC 9899:2024)
  • 7.12.10.3 remquo 函数 (p: TBD)
  • 7.25 类型泛型数学 <tgmath.h> (p: TBD)
  • F.10.7.3 remquo 函数 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.12.10.3 remquo 函数 (p: 186)
  • 7.25 类型泛型数学 <tgmath.h> (p: 272-273)
  • F.10.7.3 remquo 函数 (p: 385)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.12.10.3 remquo 函数 (p: 255)
  • 7.25 类型泛型数学 <tgmath.h> (p: 373-375)
  • F.10.7.3 remquo 函数 (p: 529)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.12.10.3 remquo 函数 (p: 236)
  • 7.22 类型泛型数学 <tgmath.h> (p: 335-337)
  • F.9.7.3 remquo 函数 (p: 465)

[编辑] 另请参见

计算整数除法的商和余数。
(函数) [编辑]
(C99)(C99)
计算浮点除法的余数。
(函数) [编辑]
计算浮点除法的带符号余数。
(函数) [编辑]
C++ 文档 for remquo