深入学习java源码之Math.max()与 Math.min()

深入学习java源码之Math.max()与 Math.min()

java基本数据类型及自动转型

8种基本数据类型及其所占空间大小:

一、byte,占用一个字节,取值范围为 -128-127,默认是“\u0000”,表示空
二、short,占用两个字节,取值范围为 -32768-32767
三、int,占用四个字节,-2147483648-2147483647
四、long,占用八个字节,对 long 型变量赋值时必须加上"L"或“l”,否则不认为是 long 型
五、float,占用四个字节,对 float 型进行赋值的时候必须加上“F”或“f”,如果不加,会产生编译错误,因为系统
自动将其定义为 double 型变量。double转换为float类型数据会损失精度。float a = 12.23产生编译错误的,float a = 12是正确的
六、double,占用八个字节,对 double 型变量赋值的时候最好加上“D”或“d”,但加不加不是硬性规定
七、char,占用两个字节,在定义字符型变量时,要用单引号括起来
八、boolean,只有两个值“true”和“false”,默认值为false,不能用0或非0来代替,这点和C语言不同

自动类型转换

1)两种类型是彼此兼容的

2)转换的目的类型占得空间范围一定要大于转化的源类型

正向过程:由低字节向高字节自动转换

byte->short->int->long->float->double

逆向过程:使用强制转换,可能丢失精度。

// 自动类型转换
short s=1;
int i;
// 自动类型转换 short类型转成int类型
i=s;

整数类型(byte/short/int/long)中,对于未声明数据类型的整形,其默认类型为int型。在浮点类型(float/double)中,对于未声明数据类型的浮点型,默认为double型。

int a=(int)3.14;

 小数的默认数字类型是double, 例如3.12. 当float a = 3.12时会报错, 因为3.12的默认数据类型是double, 我们需要使用如下的赋值方法:

float a = 3.12F
float b = (float)3.12

第一种方法在3.12后面加了一个F, 告诉编译器这是一个float的数. 第二种方法对3.12进行了强制的类型转换. 

double d=1.333;
float f;
// 把double类型的数据强制转换成float类型
f=(float)d;
int x;
double y;
x = (int)34.56 + (int)11.2;  // 丢失精度
y = (double)x + (double)10 + 1;  // 提高精度
System.out.println("x=" + x);
System.out.println("y=" + y);

x=45
y=56.0

 

Modifier and TypeMethod and Description
static doublemax(double a, double b)

返回两个 double值中的较大值。

static floatmax(float a, float b)

返回两个 float的较大值。

static intmax(int a, int b)

返回两个 int值中的较大值。

static longmax(long a, long b)

返回两个 long的较大值。

static doublemin(double a, double b)

返回两个 double的较小值。

static floatmin(float a, float b)

返回两个 float的较小值。

static intmin(int a, int b)

返回两个 int的较小值。

static longmin(long a, long b)

返回两个 long的较小值。

java源码

public final class Math {

    private Math() {}

    public static int max(int a, int b) {
        return (a >= b) ? a : b;
    }

    public static long max(long a, long b) {
        return (a >= b) ? a : b;
    }
    //在有保证的非NaN参数上使用原始的逐位转换。
    private static long negativeZeroFloatBits  = Float.floatToRawIntBits(-0.0f);
    private static long negativeZeroDoubleBits = Double.doubleToRawLongBits(-0.0d);

    public static float max(float a, float b) {
        if (a != a)
            return a;   // a is NaN
        if ((a == 0.0f) &&
            (b == 0.0f) &&
            (Float.floatToRawIntBits(a) == negativeZeroFloatBits)) {
            // Raw conversion ok since NaN can't map to -0.0.
            return b;
        }
        return (a >= b) ? a : b;
    }

    public static double max(double a, double b) {
        if (a != a)
            return a;   // a is NaN
        if ((a == 0.0d) &&
            (b == 0.0d) &&
            (Double.doubleToRawLongBits(a) == negativeZeroDoubleBits)) {
            // Raw conversion ok since NaN can't map to -0.0.
            return b;
        }
        return (a >= b) ? a : b;
    }

    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }

    public static long min(long a, long b) {
        return (a <= b) ? a : b;
    }

    public static float min(float a, float b) {
        if (a != a)
            return a;   // a is NaN
        if ((a == 0.0f) &&
            (b == 0.0f) &&
            (Float.floatToRawIntBits(b) == negativeZeroFloatBits)) {
            // Raw conversion ok since NaN can't map to -0.0.
            return b;
        }
        return (a <= b) ? a : b;
    }

    public static double min(double a, double b) {
        if (a != a)
            return a;   // a is NaN
        if ((a == 0.0d) &&
            (b == 0.0d) &&
            (Double.doubleToRawLongBits(b) == negativeZeroDoubleBits)) {
            // Raw conversion ok since NaN can't map to -0.0.
            return b;
        }
        return (a <= b) ? a : b;
    }	

}
public final class StrictMath {

    private StrictMath() {}

    public static int max(int a, int b) {
        return Math.max(a, b);
    }

    public static long max(long a, long b) {
        return Math.max(a, b);
    }

    public static float max(float a, float b) {
        return Math.max(a, b);
    }	
   
    public static double max(double a, double b) {
        return Math.max(a, b);
    }
	
    public static int min(int a, int b) {
        return Math.min(a, b);
    }

    public static long min(long a, long b) {
        return Math.min(a, b);
    }

    public static float min(float a, float b) {
        return Math.min(a, b);
    }

    public static double min(double a, double b) {
        return Math.min(a, b);
    }
}

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
NMS(Non-Maximum Suppression)非极大值抑制是目标检测中常用的一种算法,用于消除重叠的边界框,并筛选出最优的边界框。下面是Java实现NMS的完整源码。 ```java import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * NMS(Non-Maximum Suppression)非极大值抑制算法的Java实现 */ public class NMS { /** * 定义一个边界框类,用于存储边界框的坐标和置信度 */ private static class BoundingBox { float x1, y1, x2, y2; // 左上角和右下角的坐标 float confidence; // 置信度 BoundingBox(float x1, float y1, float x2, float y2, float confidence) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.confidence = confidence; } float getArea() { return (x2 - x1 + 1) * (y2 - y1 + 1); } } /** * 定义一个比较器类,用于按照置信度降序排序 */ private static class ConfidenceComparator implements Comparator<BoundingBox> { @Override public int compare(BoundingBox o1, BoundingBox o2) { if (o1.confidence > o2.confidence) { return -1; } else if (o1.confidence < o2.confidence) { return 1; } return 0; } } /** * NMS算法的主要实现 * @param boxes 边界框列表 * @param overlapThreshold IOU阈值 * @return 非极大值抑制后的边界框列表 */ public static List<BoundingBox> nms(List<BoundingBox> boxes, float overlapThreshold) { // 按照置信度降序排序 Collections.sort(boxes, new ConfidenceComparator()); List<BoundingBox> result = new ArrayList<>(); while (!boxes.isEmpty()) { BoundingBox box = boxes.remove(0); result.add(box); List<BoundingBox> toRemove = new ArrayList<>(); for (BoundingBox b : boxes) { float iou = getIOU(box, b); if (iou > overlapThreshold) { toRemove.add(b); } } boxes.removeAll(toRemove); } return result; } /** * 计算两个边界框的IOU(Intersection over Union) * @param box1 边界框1 * @param box2 边界框2 * @return IOU值 */ private static float getIOU(BoundingBox box1, BoundingBox box2) { float area1 = box1.getArea(); float area2 = box2.getArea(); float x1 = Math.max(box1.x1, box2.x1); float y1 = Math.max(box1.y1, box2.y1); float x2 = Math.min(box1.x2, box2.x2); float y2 = Math.min(box1.y2, box2.y2); float w = Math.max(0, x2 - x1 + 1); float h = Math.max(0, y2 - y1 + 1); float inter = w * h; return inter / (area1 + area2 - inter); } } ``` 使用示例: ```java public class NMSDemo { public static void main(String[] args) { List<NMS.BoundingBox> boxes = new ArrayList<>(); boxes.add(new NMS.BoundingBox(10, 10, 20, 20, 0.9f)); boxes.add(new NMS.BoundingBox(15, 15, 25, 25, 0.8f)); boxes.add(new NMS.BoundingBox(30, 30, 40, 40, 0.7f)); List<NMS.BoundingBox> result = NMS.nms(boxes, 0.5f); for (NMS.BoundingBox box : result) { System.out.println(box.x1 + "," + box.y1 + "," + box.x2 + "," + box.y2 + "," + box.confidence); } } } ``` 输出结果: ``` 10.0,10.0,20.0,20.0,0.9 30.0,30.0,40.0,40.0,0.7 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wespten

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值