C/C++如何对浮点数取余?(如果需要的话)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++如何对浮点数取余?(如果需要的话)相关的知识,希望对你有一定的参考价值。

C/C++如何对浮点数取余?(如果需要的话)

不能对float型取余,只能对整数取余。想要实现这个功能的话,你可以把逗号后面的数变成整形(具体怎么变就要看你的数字是否有规则)之后再取余。再变成浮点数 参考技术A 先把浮点数转换为整数再取余 参考技术B 不能对float型取余,只能对整数取余。 参考技术C C 标准库 - <math.h>
C 库函数 double fmod(double x, double y) 返回 x 除以 y 的余数。
参考技术D 强制类型转换后就可以
float a;
int b=(int)a,c;
c=b%d;追问

可是这样的话,比如说123mod1.8,转换之后就变成123mod1了,计算结果显然不对

追答

嗯……mod是vb语言中的用法哦,在C语言中是用“%”代替的。
计算结果显然不对?
不会哦,因为C语言是向0取余,整数则去掉小数部分,负数则小数部分补足为-1。
所以强制类型转换后结果应该是123

追问

之所以用mod描述,是因为'%'不支持浮点数
这里mod不是关键字或编程语言运算符,是自然语言
向0取余?什么意思?
C语言的将浮点型强制转换为整型时,运算结果是浮点数的整数部分,比如1.8,如果(int)(1.8)那结果就是1,123%1的结果肯定是0.
你用windows计算器算一下就知道了,123mod1.8的结果应该是0.6(近似值),而不是0.
cout<<123%(int)(1.8);//实际运行后,这个语句和我想的一样,计算结果错误,输出的是0,而不是0.6
所以我才问这个问题

CodeForces - 404B Marathon(精度)

题意:一个人绕着一个长度为a的正方形逆时针跑,以(0,0)为起点,喝一次水可以跑d米,问每喝一次水可以跑到的位置坐标。

分析:这道题卡精度卡的太厉害了。

设l是正方形的周长,只有d对l取余且每次跑d米都对l取余,并用取余后的结果继续跑,这样的精度才够。

1、double a = fmod(x, y);返回的是浮点数x对浮点数y取余后的结果。

2、每跑d米,通过对l取余得到当前位置与起点的路径长,从而确定当前位置的坐标。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-12;
inline int dcmp(double a, double b){
    if(fabs(a - b) < eps) return 0;
    return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 10000 + 10;
const int MAXT = 10000 + 10;
using namespace std;
int main(){
    double a, d;
    int n;
    scanf("%lf%lf%d", &a, &d, &n);
    double sum = 0;
    double l = 4 * a;
    d = fmod(d, 4 * a);
    while(n--){
        sum += d;
        sum = fmod(sum, l);
        double tmp = fmod(sum, a);
        if(dcmp(sum, a) < 0){
            printf("%.10f 0.0000000000\n", tmp);
        }
        else if(dcmp(sum, 2 * a) < 0){
            tmp = fmod(tmp, a);
            printf("%.10f %.10f\n", a, tmp);
        }
        else if(dcmp(sum, 3 * a) < 0){
            tmp = fmod(tmp, a);
            printf("%.10f %.10f\n", a - tmp, a);
        }
        else{
            tmp = fmod(tmp, a);
            printf("0.0000000000 %.10f\n", a - tmp);
        }
    }
    return 0;
}

  

以上是关于C/C++如何对浮点数取余?(如果需要的话)的主要内容,如果未能解决你的问题,请参考以下文章

C语言中如何对浮点数进行四舍五入?

C中的printf如何对浮点数进行舍入?

在 Matlab 中对浮点数进行位修改

C语言编写函数,对浮点数保留两位小数,对第三位四舍五入。程序如下 #include<stdio.h

对浮点数求和的最佳 OpenCL 2 内核是啥?

C语言浮点型数据能不能取余?