我最近遇到了一个问题,可以使用模数除法轻松解决,但输入是一个浮点数:
给定周期函数(例如
sin)和只能在周期范围内计算它的计算机函数(例如[-π,π]),创建一个可以处理任何输入的函数.
"明显"的解决方案是这样的:
#include <cmath>
float sin(float x){
return limited_sin((x + M_PI) % (2 *M_PI) - M_PI);
}
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?我收到此错误:
error: invalid operands of types double and double to binary operator %
Run Code Online (Sandbox Code Playgroud)
有趣的是,它确实在Python中有效:
def sin(x):
return limited_sin((x + math.pi) % (2 * math.pi) - math.pi)
Run Code Online (Sandbox Code Playgroud)
AnT*_*AnT 72
因为"余数"的正常数学概念仅适用于整数除法.即生成整数商所需的除法.
为了将"余数"的概念扩展为实数,您必须引入一种新的"混合"运算,它将为实际操作数生成整数商.Core C语言不支持此类操作,但它作为标准库函数提供,以及C99中的函数.(注意,这些函数不一样,并且有一些特殊性.特别是,它们不遵循整数除法的舍入规则.)fmodremainder
Dou*_*hen 48
你正在寻找fmod().
我想更具体地回答你的问题,在较旧的语言中,%运算符只是定义为整数模块划分,在较新的语言中,他们决定扩展运算符的定义.
编辑: 如果我打算猜测为什么,我会说这是因为模运算的思想起源于数论并专门处理整数.
Jer*_*fin 15
我不能肯定地说,但我猜它主要是历史性的.相当多的早期C编译器根本不支持浮点数.它后来被添加,甚至还没有完全添加 - 主要是添加了数据类型,以及语言支持的最原始操作,但其他一切都留给了标准库.
Mar*_*iot 12
%C和C++中的模运算符是针对两个整数定义的,但是,有一个fmod()可用于双精度的函数.