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++如何对浮点数取余?(如果需要的话)的主要内容,如果未能解决你的问题,请参考以下文章