算法小白——圆心位移

本文探讨了在解决圆桌中心移动问题时,如何正确处理浮点数比较,避免因计算机处理浮点数的精度限制而产生的错误。介绍了使用EPSINON常量进行浮点数比较的方法,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

现有一张半径为R的圆桌,其中心位于(X,Y),现在想把圆桌的中心移到(X1,Y1)。每次移动一步,都必须在圆桌边缘固定一个点然后将圆桌绕该点旋转,问最少需要几步?

输入:

3
1,1
3,3

输出:

1

注解:

float 浮点数与零值0比较

float x;

千万不要写x==0;

float x 与“零值”比较的 if 语句:

const float EPSINON = 0.00001; 
if ((x >= - EPSINON) && (x <= EPSINON) 

不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。

EPSINON 应该是一个很小的值吧 因为计算机在处理浮点数的时候是有误差的,所以判断两个浮点数是不是相同,是要判断是不是落在同一个区间的,这个区间就是 [-EPSINON,EPSINON] EPSINON一般很小,10的-6次方以下吧,具体的好像不确定的,和机器有关

引用:

http://topic.youkuaiyun.com/t/20041126/10/3590118.html

结论:

还是那句话:浮点数都是有精度限制的。
所以你存的数,不一定就是你要的数。

关于EPSILON,可不是能随便定义的!
而且应该能想到,double和float的EPSINON是不同的。
定义成什么呢?不必你去定义了,查看include文件,在float.h头文件中有很多关于浮点数的宏定义:

#define FLT_EPSILON                1.19209290E-07F
#define LDBL_EPSILON                1.084202172485504E-19

我们自己定义FLT_EPSILON一般定义为

const int FLT_EPSILON=1e-6;

代码:

#include <iostream>
#include <stdio.h>
#include <math.h>

int main()
{
	int R, X, Y;
	int x1, y1,result=0;
	float temp;
	scanf_s("%d", &R);
	scanf_s("%d,%d", &X, &Y);
	scanf_s("%d,%d", &x1, &y1);
	temp = sqrt((x1 - X) ^ 2 + (y1 - Y) ^ 2);
	while (temp >= -FLT_EPSILON)
	{
		if ((x1 == X) && (y1 == Y)) 
		{
			break;
		}
		temp = temp - (2 * R);
		result++;
	}
	printf("%d", result);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值