Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

用java的高精度都过不掉,更加强烈建议不做此题

Posted by jiyanmoyu at 2010-08-08 12:04:29 on Problem 2826
数据显然是有争议的,精度问题其实是非常地大。
无论是过掉的程序还是没过掉的的程序,都有精度问题,除法的精度问题不可避免。这关系到浮点在计算机内的表示形式,不管保留几位小数(哪怕只是取整),都有精度问题。
附上JAVA源代码,供指错:
import java.text.NumberFormat;
import java.util.*;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.math.*;
public class Main 
{
	static BigDecimal eps=new BigDecimal("0.000000001");
	static BigDecimal negeps=new BigDecimal("-0.000000001");
	static class point
	{
		BigDecimal x,y;
		void input(Scanner cin)
		{
			String s;
			s=cin.next();
			x=new BigDecimal(s);
			s=cin.next();
			y=new BigDecimal(s);
		}
		point()
		{
			x=new BigDecimal(0);
			y=new BigDecimal(0);
		}
	}
	static class segment
	{
		point p1,p2;
		void input(Scanner cin)
		{
			p1.input(cin);
			p2.input(cin);
		}
		segment()
		{
			p1=new point();
			p2=new point();
		}
	}
	static BigDecimal cross(point O,point A,point B)
	{
	       BigDecimal x1,y1,x2,y2;
	       x1=A.x.subtract(O.x);
	       y1=A.y.subtract(O.y);
	       x2=B.x.subtract(O.x);
	       y2=B.y.subtract(O.y);
	       return x1.multiply(y2).subtract(x2.multiply(y1));
	}
	static int signal(BigDecimal value)
	{
		if(value.compareTo(eps)>0)
		  return 1;
		if(value.compareTo(negeps)<0)
			return -1;
	    return 0;
	}
	static boolean intersection(segment a,segment b)
	{
	     if(signal(cross(a.p1,b.p1,b.p2))*signal(cross(a.p2,b.p1,b.p2))>0)
	       return false;
	     if(signal(cross(b.p1,a.p1,a.p2))*signal(cross(b.p2,a.p1,a.p2))>0)
	       return false;
	     return true;
	}
	static point interpoint(segment a,segment b)
	{
		BigDecimal x1,y1,x2,y2,x3,y3,x4,y4,k;
		x1=a.p1.x;
		y1=a.p1.y;
		x2=a.p2.x;
		y2=a.p2.y;
		x3=b.p1.x;
		y3=b.p1.y;
		x4=b.p2.x;
		y4=b.p2.y;
		k=cross(a.p1,b.p1,b.p2).abs().divide(cross(a.p1,b.p1,b.p2).abs().add(cross(a.p2,b.p1,b.p2).abs()),50,BigDecimal.ROUND_HALF_DOWN);
		point tmp=new point();
		tmp.x=x1.subtract(k.multiply(x1.subtract(x2)));
		tmp.y=y1.subtract(k.multiply(y1.subtract(y2)));
		return tmp;
	}
	/*static point myinterpoint(point a,segment b)
	{
		point tmp=new point();
		tmp.y=a.y;
		BigDecimal x1=b.p1.x,y1=b.p1.y,x2=b.p2.x,y2=b.p2.y,x3=a.x,y3=a.y;
		tmp.x=y2.subtract(y1).divide(x2.subtract(x1)).multiply(y3.subtract(y1)).add(x1);
		return tmp;
	}*/
	public static void main(String args[]) throws FileNotFoundException
	{
	      /*BufferedInputStream in = 
	          new BufferedInputStream(
	            new FileInputStream(
	              "data.txt"));
	      System.setIn(in);*/
	        // Produces deprecation message:
	        /*PrintStream out =
	          new PrintStream(
	            new BufferedOutputStream(
	              new FileOutputStream("test.out")));*/
	        //System.setIn(in);
	       // System.setOut(out);
	       // System.setErr(out);

		Scanner cin=new Scanner(System.in);
		while(cin.hasNext())
		{
		     int t=cin.nextInt();
		     for(int i=0;i<t;++i)
		     {
		    	 segment a=new segment();
		    	 segment b=new segment();
		    	 a.input(cin);
		    	 b.input(cin);
		    	 //System.out.println(a.p1.x+" "+a.p1.y);
		    	 if((signal(cross(a.p1,b.p1,b.p2))==0)
		    			 &&(signal(cross(a.p2,b.p1,b.p2))==0))
		    	 {  //System.out.println("first\n");
		    		System.out.println("0.00"); 
		    		continue;
		    	 }
		    	 if(signal(a.p1.y.subtract(a.p2.y))==0||
		    			 signal(b.p1.y.subtract(b.p2.y))==0||(!intersection(a,b)))
		    	 {  //System.out.println("second\n");
		    	     //System.out.println(intersection(a,b));
		    		 System.out.println("0.00");
		    		 continue;
		    	 }
		    	 point tmppoint=new point();
		         if(a.p1.y.compareTo(a.p2.y)<0)
		         {
		        	 tmppoint=a.p1;
		        	 a.p1=a.p2;
		        	 a.p2=tmppoint;
		         }
		        	// swap(a.p1,a.p2);
		         if(b.p1.y.compareTo(b.p2.y)<0)
		         {
		        	 tmppoint=b.p1;
		        	 b.p1=b.p2;
		        	 b.p2=tmppoint;
		         }
		        	// swap(b.p1,b.p2);
		         point tmp=new point();
		         tmp.x=a.p1.x;
		         tmp.y=BigDecimal.valueOf(20000.0);
		         segment tmpseg=new segment();
		         tmpseg.p1=a.p1;
		         tmpseg.p2=tmp;
		         if(intersection(b,tmpseg))
		         {   //System.out.println("third\n");
		        	 System.out.println("0.00");
		        	 continue;
		         }
		         tmp.x=b.p1.x;
		         tmp.y=BigDecimal.valueOf(20000);
		         tmpseg.p1=b.p1;
		         tmpseg.p2=tmp;
		         if(intersection(a,tmpseg))
		         {   //System.out.println("fourth\n");
		        	 System.out.println("0.00");
		        	 continue;
		         }
		         point inter=new point();
		         inter=interpoint(a,b);
		         if(b.p1.y.compareTo(a.p1.y)<0)
		         {
		        	segment segtmp=a;
		        	a=b;
		        	b=segtmp;
		         }
		         tmp.y=a.p1.y;;
		         tmp.x=BigDecimal.valueOf(20000);
		         tmpseg.p1=a.p1;
		         tmpseg.p2=tmp;
		         if(!intersection(tmpseg,b))
		         {
		                       tmp.x=BigDecimal.valueOf(-20000);
		                       tmpseg.p2=tmp;
		         }
		         point last=interpoint(tmpseg,b);
		         //point last=interpoint(tmpseg,b);
		         BigDecimal res=last.x.subtract(a.p1.x).multiply(a.p1.y.subtract(inter.y)).divide(BigDecimal.valueOf(2));
		         res=res.abs();
		         res=res.setScale(2,BigDecimal.ROUND_HALF_UP);
		         System.out.println(res.toPlainString());
		         /*double x=res.doubleValue();
		         NumberFormat ddf1=NumberFormat.getNumberInstance() ;


		         ddf1.setMaximumFractionDigits(2);
		         String s= ddf1.format(res.toPlainString()) ;
		         System.out.print(s);*/
		                   //printf("%.2lf\n",res-eps);
		     }
		}
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator