java math.sqrt给出不正确的结果(双精度)

iqxoj9l9  于 2022-11-27  发布在  Java
关注(0)|答案(1)|浏览(158)

我正在写一个程序,在一个圆内打印100个随机坐标。这个圆的半径为10,圆心位于(0,0)。但是,当我使用以下命令时,一些坐标y:value计算错误:y = Math.sqrt(100 -x^2)结果像off...为什么会这样?(见图)对于正的y:值,它们有时会变得太大,这是因为math.sqrt计算中使用了双精度。

package RKap14;

import ZindansMethods.ZindanRandom;

public class Dot {
    public double x;
    public double y;
    
    public static void main(String[] arg)throws Exception {
        
        //Create the array with null fields?
        Coord[] c;
        //Decide how many fields
        c = new Coord[100];
        //Create an object of class Coord in each slot of the array
        for(int i = 0; i<c.length; i++) {
            c[i] = new Coord();
        }
            //Assign random coordinates for each field x & y
            for(int i = 0; i<c.length; i++) {
                c[i].x = ZindanRandom.randomized(-10,10); 
                    //Since sometimes Java calculates wrong and gives numbers above 10 and below -10...
                    while(c[i].x > 10 || c[i].x < -10)
                    c[i].x = ZindanRandom.randomized(-10,10); 
                c[i].y = ZindanRandom.randomized(-Math.sqrt(100-c[i].x*c[i].x), Math.sqrt(100-c[i].x*c[i].x));
            }
        
        
            //Print out the coordinates in form: (x,y),(x1,y1)...(x99,y99)
        for (int i = 0; i<c.length; i++) {
            System.out.print("(" + c[i].x + "," + c[i].y + ")" + ",");
        }

    }
}

class Coord {
    double x;
    double y;
}

我使用的随机方法:

//Gives random number a to b. For example -10 <= x <= 10
public static double randomized (double a, double b) {
        return (a-1+Math.random()*Math.abs(b-a+1)+1);       
    }

我不知道该怎么做。我试着用三角法来做这个程序,但我更想知道为什么计算器的工作不正确。是小数太多了吗?我能做点什么吗?
Circle test

uemypmqf

uemypmqf1#

随机函数生成的数字超出了给定范围
例如,如果将值代入等式和,并使用1作为Math.random()返回的值,则将得到101。
请尝试以下随机函数:

public static double randomized(double min, double max)
  return Math.random() * (max - min) + min;
}

相关问题