商业计算怎样才能保证精度并防止溢出

NXP电能计量库实战:高精度与低功耗双版本嵌入式开发指南 在嵌入式系统开发中,数字信号处理(DSP)是实现高精度数据采集与处理的核心技术,其原理在于对模拟信号进行采样、量化和算法运算。这项技术的核心价值在于能够将复杂的物理信号(如交流电压电流)转换为可精确分析和控制的数字信息,从而为智能硬件提供可靠的感知与决策基础。在工业物联网和智能电网等应用场景中,电能计量是DSP技术的关键落地领域,它直接关系到能耗监测的准确性与系统能效。NXP Semiconductors提供的Metering Library正是这一领域的成熟解决方案,它通过封装去除直流偏置、计算有效值等核 阅读详情

引言

很多系统都有「处理金额」的需求,比如电商系统、财务系统、收银系统,等等。只要和钱扯上关系,就不得不打起十二万分精神来对待,决不允许出现资损。少侠之前在的公司,是做电商的,有对公打款的业务,公司财务每月都会进行财务审计,要是账面上差上一元钱都要进行说明,可想而知这严谨性。

保证金额的准确性主要有两个方面:溢出和精度。溢出是指存储数据的空间得充足,不能金额较大就存储不下了。精度是指计算金额时不能有偏差,多一点少一点都不行。

溢出问题大家都知道如何解决,选择位数长的数值类型即可,即不用 float 用 double 。而精度问题,double 就无法解决了,因为浮点数会导致精度丢失。

我们来直观感受一下精度丢失:

double money = 1.0 - 0.9;

这个运算结果谁都知道该为 0.1,然而实际结果却是 0.09999999999999998。出现这个现象是因为计算机底层是二进制运算,而二进制并不能精准表示十进制小数。所以在商业计算等精确计算中要使用其他数据类型来保证精度不丢失,一定不要使用浮点数。

本文会详细讲解在实际开发中到底该怎样进行商业计算,并展示相关代码和 SQL 语句。

方案

方案1 定长整数

定长整数,顾名思义就是固定(小数)长度的整数。它只是一个概念,并不是新的数据类型,我们使用的还是普通的整数。

金额好像理所应当有小数,但稍加思考便会发觉小数并非是必须的。之前我们演示的金额单位是元,1.55 就是一元五角五分。那如果我们单位是角,一元五角五分的值就会变成 15.5。如果再将单位缩小到分,值就为 155。没错,只要达到最小单位,小数完全可以省略!这个最小单位根据业务需求来定,比如系统要求精确到厘,那么值就是1550。当然,一般精确到分就可以了,咱们接下来演示单位都是分。

咱们现在新建一个字段,类型为 bigint,单位为分,代码中对应的数据类型自然是 Long。基本类型的数值运算我们是再熟悉不过的了,直接使用运算操作符即可:

关于表示整数用Long类型而不用Integer类型,因为我们知道Integer最大值是21亿多,转换成元也就是2100W,如果再考虑汇率(如越南盾这种很小的汇率,1人民币约等于3600越南盾),则最大只能表示几万人民币,可想而知是远远不够的。

long d1 = 10000L; // 100元
d1 += 500L; // 加五元
d1 -= 500L; // 减五元

加和减没什么好说的,乘和除可能会出现小数的情况,比如某个商品打八折,运算就是乘以 0.8:

long d1 = 2366L; // 23.66元
double result = d1 * 0.8; // 打八折,运算后结果为1892.8
d1 = (long)result; // 转换为整数,舍去所有小数,值为1892。即18.92元

进行小数运算,类型自然而然就会变为浮点数,所以我们还要将浮点数转换为整数。

强转会将所有小数舍去,这个舍去并不代表精度丢失。业务要求最小单位是什么,就只保留什么,低于分的单位我们压根没必要保存。这一点和 BigDecimal 是一致的,如果系统中只需要到分,那小数精度就为 2, 剩余的小数都舍去。

不过有些业务计算可能要求四舍五入等其他操作,这一点我们可以通过 Math类来完成:

long d1 = 2366L; // 23.66元
double result = d1 * 0.8; // 运算后结果为1892.8
d1 = (long)result; // 强转舍去所有小数,值为1892
d1 = (long)Math.ceil(result); // 向上取整,值为1893
d1 = (long)Math.round(result); // 四舍五入,值为1893
...

再来看除法运算。当整数除以整数时,会自动舍去所有小数:

long d1 = 2366L;
long result = d1 / 3; // 正确的值本应该为788.6666666666666,舍去所有小数,最终值为788

如果要进行四舍五入等其他小数操作,则运算时先进行浮点数运算,然后再转换成整数:

long d1 = 2366L;
double result = d1 / 3.0; // 注意,这里除以不是 3,而是 3.0 浮点数
d1 = (long)Math.round(result); // 四射勿入,最终值为789,即7.89元

虽说数据库存储和代码运算都是整数,但前端显示时若还是以分为单位就对用户不太友好了。所以后端将值传递给前端后,前端需要自行将值除以 100,以元为单位展示给用户。然后前端传值给后端时,还是以约定好的整数传递。

定长整数的用法就介绍到这,我们接下来看第二种解决方案。

方案2 BigDecimal

关于数据类型的选择,一要考虑数据库,二要考虑编程语言。即数据库中用什么类型来存储数据,代码中用什么类型来处理数据。

数据库层面自然是用 decimal 类型,因为该类型不存在精度损失的情况,用它来进行商业计算再合适不过。

将字段定义为 decimal 的语法为 decimal(M,N),M 代表存储多少位,N 代表小数存储多少位。假设 decimal(20,2),则代表一共存储 20 位数值,其中小数占 2 位。这里小数位置保留 2 点,代表金额只存储到分,实际项目中存储到什么单位得根据业务需求来定,都是可以的。

数据库层面搞定了咱们来看代码层面,在 Java 中对应数据库 decimal 的是 java.math.BigDecimal类型,它自然也能保证精度完全准确。

要创建BigDecimal主要有三种方法:

BigDecimal d1 = new BigDecimal(0.1); // BigDecimal(double val)
BigDecimal d2 = new BigDecimal("0.1"); // BigDecimal(String val)
BigDecimal d3 = BigDecimal.valueOf(0.1); // static BigDecimal valueOf(double val)

前面两个是构造函数,后面一个是静态方法。这三种方法都非常方便,但第一种方法禁止使用!看一下这三个对象各自的打印结果就知道为什么了:

d1: 0.1000000000000000055511151231257827021181583404541015625
d2: 0.1
d3: 0.1

第一种方法通过构造函数传入 double 类型的参数并不能精确地获取到值,若想正确的创建 BigDecimal,要么将 double 转换为字符串然后调用构造方法,要么直接调用静态方法。事实上,静态方法内部也是将 double 转换为字符串然后调用的构造方法:

在这里插入图片描述

如果是从数据库中查询出小数值,或者前端传递过来小数值,数据会准确映射成 BigDecimal 对象,这一点我们不用操心。

说完创建,接下来就要说最重要的数值运算。运算无非就是加减乘除,这些 BigDecimal 都提供了对应的方法:

BigDecimal add(BigDecimal); // 加
BigDecimal subtract(BigDecimal); // 减
BigDecimal multiply(BigDecimal); // 乘
BigDecimal divide(BigDecimal); // 除

BigDecimal 是不可变对象,意思就是这些操作都不会改变原有对象的值,方法执行完毕只会返回一个新的对象。若要运算后更新原有值,只能重新赋值:

d1 = d1.subtract(d2);

口说无凭,我们来验证一下精度是否会丢失 :

BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("0.9");
System.out.println(d1.subtract(d2));

输出结果毫无疑问为 0.1。

代码方面已经能保证精度不会丢失,但数学方面除法可能会出现除不尽的情况。比如我们运算 10 除以 3,会抛出ArithmetricException异常。

为了解决除不尽后导致的无穷小数问题,我们需要人为去控制小数的精度。除法运算还有一个方法就是用来控制精度的:

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

scale 参数表示运算后保留几位小数,roundingMode 参数表示计算小数的方式。

BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("3");
System.out.println(d1.divide(d2, 2, RoundingMode.DOWN)); // 小数精度为2,多余小数直接舍去。输出结果为0.33

用 RoundingMode 枚举能够方便地指定小数运算方式,除了直接舍去,还有四舍五入、向上取整等多种方式,根据具体业务需求指定即可。

注意,小数精度尽量在代码中控制,不要通过数据库来控制。数据库中默认采用四舍五入的方式保留小数精度。

比如数据库中设置的小数精度为2,我存入 0.335,那么最终存储的值就会变为 0.34。

我们已经知道如何创建和运算 BigDecimal 对象,只剩下最后一个操作:比较。因为其不是基本数据类型,用双等号 == 肯定是不行的,那我们来试试用 equals比较:

BigDecimal d1 = new BigDecimal("0.33");
BigDecimal d2 = new BigDecimal("0.3300");
System.out.println(d1.equals(d2)); // false

输出结果为 false,因为 BigDecimal 的 equals 方法不光会比较值,还会比较精度,就算值一样但精度不一样结果也是 false。我们先看看BigDecimal里的equals方法源码:


public boolean equals(Object x) {
    //类型不同,直接返回false
    if (!(x instanceof BigDecimal))
        return false;
    BigDecimal xDec = (BigDecimal) x;
    //同一个对象,直接返回true
    if (x == this)
        return true;
    //精度不同,直接返回false!!
    if (scale != xDec.scale)
        return false;
    long s = this.intCompact;
    long xs = xDec.intCompact;
    if (s != INFLATED) {
        if (xs == INFLATED)
            xs = compactValFor(xDec.intVal);
        return xs == s;
    } else if (xs != INFLATED)
        return xs == compactValFor(this.intVal);

    return this.inflated().equals(xDec.inflated());
}

可以看到equals方法是会比较精度的。若想避开精度判断值是否一样,需要使用 int compareTo(BigDecimal val) 方法:

BigDecimal d1 = new BigDecimal("0.33");
BigDecimal d2 = new BigDecimal("0.3300");
System.out.println(d1.compareTo(d2) == 0); // true

d1 大于 d2,返回 1;
d1 小于 d2,返回 -1;
两值相等,返回 0。

点点关注,不会迷路。

FreeRTOS死机排查实战:从栈溢出到优先级反转的深度解析 在嵌入式实时操作系统开发中,任务死锁、内存溢出和中断处理不当是导致系统崩溃的常见原因。理解实时操作系统的基本原理,如任务调度、内存管理和中断机制,对于构建稳定可靠的嵌入式系统至关重要。这些底层机制一旦出现异常,轻则导致功能失效,重则引发系统死机,直接影响产品的可靠性和用户体验。从技术价值角度看,掌握系统级调试和问题定位能力,能显著提升开发效率和系统质量。在实际应用场景中,无论是工业控制、物联网设备还是消费电子产品,稳定的RTOS运行都是功能实现的基础。本文聚焦FreeRTOS环境下,针对栈溢出检测、硬件错误 阅读详情

相关推荐

加法秘密共享的隐私计算实践:从基础原理到乘法运算优化

本文深入探讨了加法秘密共享(Additive Secret Sharing)技术在隐私计算中的应用,从基础原理到乘法运算优化。通过实际案例展示了如何在医疗、金融等领域安全地共享和计算敏感数据,同时详细介绍了Beaver三元组等关键技术,以及性能优化和实际应用中的挑战与解决方案。

weixin_29322855的博客 312

第2章 Java编程基础——FAQ2.10 如何解决double和float精度不准的问题?

FAQ2.10 如何解决double和float精度不准的问题? 答: float和double型,的底层实现是二进制的。十进制中的一个有限位数小数,转换成二进制就不一定是有限位数了,一旦位数超过的float和double型的位数宽度,就会出现“精度溢出”。所以float和double型是为了科学计算而设计的,并不适合精确的十进制计算. 就像一个十进制的小数,要不断地乘以2取整,...

dengyansui9157的博客 258

AI落地四大断层:数据、工程、人才与商业的 readiness 实战指南

AI落地难,本质不是模型能力不足,而是行业在数据基建、工程化能力、复合型人才和商业对齐四个维度存在系统性断层。从‘有数据’到‘可用数据’需跨越schema稳定性、时间一致性与语义可解释性;模型服务化必须解决GPU资源隔离、弹性扩缩与灰度发布等生产级挑战;T型人才共建与特性小组制正成为破除算法-工程割裂的关键组织范式;而真正决定AI项目成败的,是能否将技术指标转化为业务语言——如留存率、响应时长、GMV等可衡量结果。本文聚焦AI industry readiness这一高频搜索概念,结合数据治理、MLOps、

xjwolaile的博客 398

整数转浮点数精度溢出的原因和处理方式

对于64位浮点数来说,其尾数有53位(包含首位的隐藏位),当一个整数转为浮点数时,只有当该整数的二进制位数不超过53位时,64位浮点数才可以精确的表示该整数,不然会造成精度丢失。试想一下,当一个十进制整数的二进制有54位,那么最后一位无法准确储存,64位浮点数就会造成精度的丢失,自然地,当位数超过53位后,64位浮点数的可表示整数并不是连续的。 在笔者的这篇文章《浮点数的各种最值推算以及对python sys.float_info的解释》中,讲过浮点数能在该范围内精确表示的最大...

S_o_l_o_n的博客 4574

js精度溢出解决方案

一般参数值不能超过16位。如果超出16都是用0替代,导致我们查询不到自己想要的结果,本文将介绍如何处理这种现象

Simulink中扩张状态观测器ESO搭建与参数整定实战

扩张状态观测器(ESO)是自抗扰控制(ADRC)的核心,用于估计系统总扰动并实时补偿。其原理是将扰动扩张为状态变量,通过观测器带宽配置增益,实现扰动估计。在Simulink中搭建ESO可直观验证连续与离散域性能,解决参数整定与噪声折中问题。典型应用包括运动控制、电力电子和机器人驱动。本文基于MATLAB/Simulink,详细讲解线性ESO的模型结构、参数计算、离散化实现及常见问题排查,帮助读者从零搭建并调试ESO仿真。

weixin_34116482的博客 222

数值计算精度、舍入和溢出问题

但,所谓积土成山,如果大量使用 double 来作大量的金钱计算,最终损失的精度就是大量的资金出入。BigDecimal 的 toString 方法得到的字符串和 scale 相关,又会引出了另一个问题:对于浮点数的字符串形式输出和格式化,我们应该考虑显式进行,通过格式化表达式或格式化工具来明确小数位数和舍入方式。第二,对浮点数做精确计算,参与计算的各种数值应该始终使用 BigDecimal,所有的计算都要通过 BigDecimal 的方法进行,切勿只是让 BigDecimal 来走过场。

xiaoshitou_2015的博客 1497

ZYNQ裸机双网口通信实战:手把手教你用SDK和LWIP配置PS+PL以太网(附完整源码)

本文详细介绍了在ZYNQ裸机环境下实现双网口通信的全流程,包括硬件配置、LWIP协议栈优化及TCP通信实现。通过Vivado SDK和LWIP协议栈,开发者可以高效配置PS端内置网口与PL端扩展网口,提升嵌入式网络应用的灵活性和性能。附完整源码,助力快速开发。

weixin_30831529的博客 421

如何理解整型数的溢出与浮点数的精度?

各类型整型数据能表示的范围有一定的限制,当数据超出该类型的存储范围时,会造成整型数的溢出。由于浮点数的精度问题,对于一个浮点型变量的赋值与实际存储在内存中的数值可能并不相同,由此可见,虽然float型可以存储38位十进制的实数,但仅前7位数是精确无误的。

xmzq001的博客 674

ANSYS拓扑优化基础实例

唐深51CAE 2018/6/10 拓扑优化在工程设计中,常用于机械结构概念设计和轻量化设计,ANSYS通用有限元分析软件提供了强大的拓扑优化功能,本文将通过一个简单实例进行展示。 一、赵州桥 赵州桥又称安济桥,坐落在河北省赵县洨河上,建于隋朝年间公元595年~605年,由著名匠师李春设计建造,距今已有约1500年的历史,是当今世界上现存最早、保存最完整的古代敞...

TQT_CAE的博客 6027

零基础学会制作 基于STM32/51单片机的智能血压表设计/血压表/血压计

本系统是以单片机为主控,传感器模快、显示模块、人机交互、无线传输等组成的智能血压表设计。传感器用于测量血压和脉搏,主控电路板用于处理数据和控制设备,显示屏则用于显示测量结果。通过软件设计,完成测量数据的处理,其中血压和脉搏的测量、数据的分析和处理等。

weixin_55654459的博客 2473

2020-11-12

java数据类型中关于数据溢出的一些事情 byte表示整型变量; 在java中的存储的内存范围在-128-127之间,占用一个字节。 对于理解数据类型的值溢出可以有一些比喻实例: 比如:有一大杯水,但是里边只剩几口了。这时我们可以将其倒入到水其他更小的杯子中,这时可以用小杯子喝水。 其中的大杯子表示范围更大的数据类型,而小杯子表示数据范围小的。 现在举个实际例子:当int类型的数据存储到了一个128的值,我们要将其赋值给byte类型的数据, int a = 128; byte b; b = a; 这时候整

zmzmii的博客 247

项目方案:社会视频资源整合接入汇聚系统解决方案(五)

视频监控接入和视频汇聚平台,形成整合平台,平台服务层包括编码设备、存储设备、解码设备等的接入服务,提供基础视频服务、传输服务、存储服务、控制服务及事件服务。两种不同的接入方式:监控设备接入,是指接入社会单位视频监控系统的DVR(数字硬盘录像机)、DVS和IPC、DVR/NVR、CVR等设备;平台对接,是指对接接入社会单位数字视频监控平台。AS-VAG视频监控接入网关支持onvif、国标等接入,也支持多种SDK接入方式,包括国产的主流品牌支持海康、大华、宇视、华为等SDK,国际品牌支持松下和axis等SDK。

weixin_70208651的博客 2464

rea 逆向对照实测完整指南:手动读二进制 vs 带证据的自动工作流,差距到底在哪

同一个目标二进制,手动读要翻几十页伪代码、人脑里记着调用关系,rea 的自动工作流把结论压成 6 次带 SHA-256 指纹的调用。快多少不是本文的重点,**快出来的东西能不能被再次验证,才是**。rea 是一个"从应用行为一路追到原生二进制"的逆向工具,本次实测对照的就是它和传统手动读二进制之间的差距。 [![rea 原生二进制逆向分析在 Hopper 中的自动流程](https://raw.

gitblog_01165的博客 1045

【RK3588开发记录】超详细的RK3588修改debug串口波特率为115200

修改RK3588的debug串口为115200

Crazydrams的博客 4805

主成分分析避坑指南:为什么你的PCA结果总是不理想?

本文深入剖析了主成分分析(PCA)在实际应用中效果不佳的常见原因与解决方案。针对数据标准化、协方差矩阵选择、主成分数量确定、载荷矩阵解读等关键环节,提供了详细的避坑指南和诊断方法,并探讨了PCA的局限性及非线性数据结构下的备选方案,帮助数据分析师获得更稳健、可解释的降维结果。

convnet3designer的博客 511

#DBHOO-LPU在多精度 GEMM 优化技术解析

本文介绍了多精度矩阵乘法(GEMM)在大型语言模型推理中的核心优化技术。不同精度(包括FP16/BF16、INT8、INT4和FP8)在存储占用和计算效率上各有优势,可针对不同场景需求灵活选择。关键优化包括缓存友好的数据布局、量化方案选择、硬件指令加速等。DBHOO商业版支持全精度栈,能自动调优实现最佳性能。多精度GEMM技术显著提升了计算效率,同时平衡了精度与性能,适用于从云端到边缘的各种部署场景。

fmz2222的博客 316

博途S7-1500T 使用工艺对象驱动液压轴(含SimaHydTO库)

利用工艺对象控制液压轴位置含PLC控制和仿真程序文档资料下载地址如下:液压比例伺服阀的相关应用知识请参看下面的博客文章:液压位置闭环控制(比例伺服阀应用)_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 2899

吉林大学专业课计算机安全期末复习重点以及历年题

• **标识就是系统要标识用户的身份,并为每个用户取一个系统可以识别的内部名称——用户标识符。**用户标识符必须是惟一的且不能被伪造,防止一个用户冒充另一个用户。•。

m0_60388419的博客 907

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

写代码只是皮毛,这才是计算机科学

从计算机发家史开始讲起

ifeng 638

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

从数学公式到代码原型:AI 论文复现的实用路径

去年帮团队复现一篇顶会论文时,我们花了三周时间才把那个漂亮的损失函数跑通。后来才发现,论文里轻描淡写写的"我们使用了标准归一化",实际涉及了 7 种边界情况的处理。这几乎成了 AI 开发者的共同经历:论文里的优雅公式,落到代码里就变成了满地 bug。核心矛盾在于学术与工程的视角差异。论文作者追求理论完整性,会保留所有数学上的严谨性;而工程师需要的是能跑通的最小可行方案。

qq_35160742的博客 5037

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

51单片机秒表设计全解析:从仿真到PCB的0.01秒精度实现

单片机定时器是嵌入式系统实现精确时间控制的核心模块,其工作原理是通过对内部时钟脉冲进行计数,在达到预设值时触发中断,从而完成周期性任务。这项技术为各类电子设备提供了基础的时间基准,具有极高的工程价值,广泛应用于工业控制、智能仪表和消费电子等领域。本文以51单片机定时器为核心,结合数码管动态扫描和按键消抖等关键技术,深入剖析了一个精度达0.01秒的秒表项目的完整实现方案。该项目不仅提供了可运行的Protues仿真电路和Keil C51源码,还包含了详细的Altium Designer原理图与PCB设计文件,为

weixin_33701617的博客 361

Matplotlib复杂子图布局自动化:Subplot位置计算器设计与实现

在数据可视化领域,多子图布局是展示复杂数据关系的核心手段。其原理是通过在单一画布上规划多个坐标轴的几何位置,实现信息的有效组织与对比。这项技术的价值在于将开发者从繁琐的坐标计算中解放出来,确保图表排版精确、专业且可复现,从而提升数据分析与报告生成的效率。在实际工程中,手动计算子图位置极易引发图表重叠或对齐错误,尤其是在处理非标准网格、嵌套图表等复杂场景时,常需应对位置不一致等挑战。应用场景广泛覆盖学术论文图表、商业仪表板以及任何需要高质量、定制化排版的可视化需求。本文聚焦于构建一个Subplot位置计算器,

weixin_34265814的博客 330

AI智能证件照制作工坊如何防止滥用?API限流机制设计

本文探讨了AI智能证件照制作工坊的API限流机制设计,以防止服务滥用。该镜像可一键自动化部署于星图GPU平台,其核心应用场景是用户上传自拍后,快速生成符合规范的专业证件照,极大简化了传统拍照流程。

weixin_42298164的博客 186

吉林大学专业课计算机安全期末复习重点以及历年题(1)

• **标识就是系统要标识用户的身份,并为每个用户取一个系统可以识别的内部名称——用户标识符。**用户标识符必须是惟一的且不能被伪造,防止一个用户冒充另一个用户。•。

m0_60388419的博客 597

斯坦福大学CS143编译原理课程笔记:3.编译器的性价比

为什么会有那么多编程语言? 对于编程应用领域来说,它的需求非常独特,又充满矛盾,众口难调,很纳为程序员设计一款能够应用所有情况的编程语言。 科学计算 就拿科学计算来说,科学通常应用于大型计算机主要的应用工程,也用于大科学和需要长时间运算的实验以及模拟实验上,实现这种运算,编程语言需要满足有非常好的浮点运算的支持,简称FP,需要对数组和数组操作有着很好的支持,因为大部分科学应用中最常见的数据类型就是有浮点数的大数组,因为通常情况下我们计算的外界因值或者一些进行演算的算法因子,通常都是浮点...

17岁boy的博客 919
上一篇: 【HTTP】cookies和session的爱恨情仇
下一篇: 【享学MySQL】慢查询分析与排查
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值