浮点数表示 & 缓存 & 布隆过滤器
浮点数表示 & 缓存 & 布隆过滤器
- 1.计算机是如何表示小数
- 2.缓存
- 3.布隆过滤器
1.浮点数的表示
引子: 我们先看一个错误示例
public static void main(String[] args) {
System.out.println(1f == 0.999999f); // false
System.out.println(1f == 0.9999999f); // false
System.out.println(1f == 0.99999999f); // true
System.out.println(1f == 0.999999999999f); // true
}
注意: 不能使用 "==" 对浮点值进行判断
浮点数之间的等值判断,基本数据类型不能使用 "==" ,包装数据类型不能使用 equals来判断 --- 阿里巴巴Java开发手册[强制]
为什么浮点数不能使用 "==" 判断 ?
计算机是如何表示小数的?
十进制小数
D=m∑i=−ndi∗10i
二进制小数
B=m∑i=−nbi∗2i
IEEE-745浮点标准
V=(−1)s∗M∗2E
- s 符号位
- M 阶码部分
- E 尾数部分
符号s: 0正,1负
阶码E: float 8bit(-128,127) double 11bit(-1023,1024)
尾数M:float 23bit double 52bit
V=x∗2y
根据exp的值,被编码的值可以分为三种
- 规格化的值
- 非规格化的值
- 特殊值
1.规格化的值
E=e−Bias
M=1+f
- e - exp表达式的值
- Bias
Bias=2k−1−1;(127,1023)
- M - 调整阶码的值
1101.111=1.101111∗23
案例example
13.87510=1101.1112=1.1011112∗23
M=1+f
f=1011111
e=E+Bias=3+127=13010=100000102
13.875 |
---|
Sign Exponent Mantissa |
0x415E0000 = 01000001 01011110 00000000 00000000 0 10000010 10111100000000000000000 |
2.非规格化的值
E=1−Bias
M=f
3.特殊值
a.当exp全部为1,小数域全为0,表示无穷
b.当exp全部为1,小数域frac不等于0,表示NaN(not a number)
2.缓存
应用缓存 ->性能优化案例:
- 操作系统
- 数据库
- 分布式缓存
- 本地缓存
缓存目的: 弥补cpu高算力和IO读写慢之间的鸿沟
缓存
缓存问题

3.布隆过滤器
如何判断一个元素是否已经存在?
1.set集合
2.数据+hash , index = hash(xx) % table.length
3.Bloom Filter
布隆过滤器:
-
减少hash冲突,优化hash函数(多个hash实现)
-
增加数组长度
假设用100w的数据量
- 使用int数组
1∗106∗4(Byte)=4∗106/1024=4000k- 使用位数组
1∗106/8=125000(byte)=127k
布隆过滤器的判断方法
- 布隆过滤器判定某个元素存在,其实有可能存在(hash冲突)
- 布隆过滤器判定某个元素不存在,则一定不存在
布隆过滤器的使用场景
- 判断数据在海量数据中是否存在,防止缓存穿透
- 判定某个URL是否已经处理过
布隆过滤器的实现
package src.bloomFilter;
import java.util.BitSet;
/**
* @Author deng shuo
* @Date 6/12/21 10:07
* @Version 1.0
*/
public class MyBloomFilter {
private static final int DEFAULT_SIZE = 2 << 24;
private static int[] SEEDS = new int[]{3,13,46};
private static BitSet bits = new BitSet(DEFAULT_SIZE);
private SimpleHash[] func = new SimpleHash[SEEDS.length];
public MyBloomFilter(){
for(int i = 0;i< SEEDS.length;i++){
func[i] = new SimpleHash(DEFAULT_SIZE,SEEDS[i]);
}
}
public void add(Object value){
for(SimpleHash f: func){
bits.set(f.hash(value),true);
}
}
public boolean contains(Object value){
boolean res = true;
for(SimpleHash f:func){
res = bits.get(f.hash(value));
if(!res){
return false;
}
}
return true;
}
public static class SimpleHash{
private int cap;
private int seed;
public SimpleHash(int cap ,int seed){
this.cap = cap;
this.seed = seed;
}
public int hash(Object value){
int h;
return (value == null) ? 0:
Math.abs(seed*(cap -1) & (h=value.hashCode())^(h>>>16));
}
}
}
Guava工具库实现布隆过滤器
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0.1-jre</version>
</dependency>
// 创建布隆过滤器对象,最多元素数量为10000,期望误报概率为0.01
BloomFilter<Integer> filter = BloomFilter.create(
Funnels.integerFunnel(), 10000, 0.01);
不要用狭隘的眼光看待不了解的事物,自己没有涉及到的领域不要急于否定.
每天学习一点,努力过好平凡的生活.
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 开发的设计和重构,为开发效率服务
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 从零开始开发一个 MCP Server!
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时