java中的算数运算符号用法与原理分析

Java基础--运算符(包括位运算详解) 一、赋值运算符 = 将右边的值赋值给左边的变量, 一定要等右边所有的代码运算完毕再进行赋值 int i = 100*10; 二、算数运算符 + - * / % (1)在算数运算符使用的过程中,注意运算结果的数据类型,可能和参与运算的变量类型不一致。 如下图这样写是正确的: 但我们把int类型改成byte就会出错: 为啥呢? 我们来看一下,若i赋值为127,j赋值为127,那么i+j的值就超过了byte的范围。 为了解决这种问题,Java做了这样一个调整,当数据类型是小于int的. 阅读详情

一、表达式求值简单说明:
1、求值表达式主要包括加减乘除四种基本运算,其实表达式可以看做由一个个二元运算构成,前一个二元运算的结果作为后一个二元运算的输入。

        举个例子: “1+2-4=”,“1+2”就是一个二元运算,1和2是操作数,+是运算符,它们的运算结果3作为下一个二元运算的输入,所以下一个二元运算是“3-4”,这样经过两次二元运算后得出结果-1,此时碰到表达式结束符号“=”,那么表达式运算结束,最终值为-1。当然有时候表达式不是以等号作为结束符号的,这种场景要特别注意下。
 

2、加减乘除四种运算符是有优先级的,乘法和除法同级,且比加法和减法优先级高,也就是说同级的运算顺序是从左到右,高优先级的二元运算优先执行。

        举个例子:“1+2*3=”,“2*3”这个二元运算因为乘法的优先级高,所以优先执行,执行结果作为+二元运算的第二个操作数。
 

3、括号运算其实相当于嵌套一个子表达式,而子表达式的优先级比括号外的加减乘数二元运算高,子表达式的计算结果作为主表达式的一个操作数。
 

4、由上面的说明可知,表达式有两个基本元素,那就是操作数和运算符,运算符一般占用一个字符,而操作数可能是1, 2, 3这样的个位整数,也可能是1.0, 1.89这样的浮点数,也可能是100, 189这样的多位整数。所以我们在从表达式解析出操作数时要完整的解析出整个操作数。
 

5、表达式一般以等号作为表达式结束标记,当然有不以等号作为结束标记的场景,详情看下面代码处理逻辑。


 

二、算法思想简单说明:
1、表达式由正则模式 "[0-9\\.+-/*()= ]+" 来校验合法性。
 

2、表达式的操作数将push到一个数值栈中,而运算符将push到运算符栈中,解析表达式时,采用逐个读取字符的形式,特别注意操作数是多位字符的场景,可以采用一个追加器将字符先缓存起来,当完整读取一个数值时再讲数值push到数值栈中。
 

3、当准备push到运算符栈的当前运算符,优先级同级于或低于栈顶运算符时,将触发一次二元运算,参与二元运算的为运算符栈的栈顶元素以及数值栈栈顶的两个操作数。二元运算得支持高精度运算,同时避免精度丢失问题。

        举个例子: “2 * 3 - 1=”,在读取到运算符 “-” 前,运算符栈中已有元素[“*”],数值栈中有元素[“3”、“2”],因为运算符“-”的优先级比栈顶运算符“*”的优先级低,所以触发二元运算 “2 * 3”,相关操作数和运算符出栈,运算结果“6”作为新的操作数push到数值栈中。特别注意,此时如果运算符栈中栈顶还有元素,那么优先级比对还得继续,这是一个递归操作,直到运算符栈没有元素或者当前运算符“-”的优先级高于栈顶元素,那么当前运算符push到运算符栈,继续读取表达式的下一个元素。
 

4、括号运算,相等于子表达式运算,当表达式解析到左括号时,将左括号push到运算符栈,当解析到右括号时,将递归运算整个子表达式的所有二元运算操作,直到碰到左括号才停止,此时子表达式的计算结果作为新的操作数push到数值栈中。

      举个例子: “2 * (3 - 1*2)=”,在解析到右括号“)”前,运算符栈中已有元素[“*”,“-”,“(”,“*”],数值栈已有元素[“2”、“1”、“3”、“2”]。 【温馨提示,这里元素从左到右依次表示从栈顶到栈底,没有用更直观的图示,请见谅。】

        当碰到右括号时,触发一次二元运算,即“1*2”,运算符栈的栈顶元素“*”出栈,数值栈的栈顶元素“2”和“1”分别出栈,二元运算得出结果“2”,结果值push到数值栈。此时运算符栈中已有元素[“-”,“(”,“*”],数值栈已有元素[“2”、“3”、“2”]。

        子表达式还没运算结束,继续递归触发二元运算,即“3-2”,运算符栈的栈顶元素“-”出栈,数值栈的栈顶元素“2”和“3”分别出栈,二元运算得出结果“1”,结果值push到数值栈。此时运算符栈中已有元素[“(”,“*”],数值栈已有元素[“1”、“2”]。

        继续读取运算符栈顶元素,发现是左括号“(”,此时栈顶元素出栈,而无需触发二元计算,此时运算符栈中已有元素[“*”],数值栈已有元素[“1”、“2”]。

        表达式继续解析,此时发现读取到等号“=”,递归触发表达式的所有二元运算,即“2*1”,得出最终结果2,计算结束。
 

5、浮点数比较是否相等,因为浮点数有精度原因,所以要用精度范围的方式,参考下面代码实现。

三、完整可运行算法实现如下:
 

package com.begoina.zero;
 
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
 * 加减乘除表达式求值算法
 * @date 2018年7月7日
 * @version 1.0
 */
public class Calculator {
    
    // 表达式字符合法性校验正则模式,静态常量化可以降低每次使用都要编译地消耗
    private static final Pattern EXPRESSION_PATTERN = Pattern.compile("[0-9\\.+-/*()= ]+");
    
    // 运算符优先级map
    private static final Map<String, Integer> OPT_PRIORITY_MAP = new HashMap<String, Integer>() {
        private static final long serialVersionUID = 6968472606692771458L;
        {
            put("(", 0);
            put("+", 2);
            put("-", 2);
            put("*", 3);
            put("/", 3);
            put(")", 7);
            put("=", 20);
        }
    };
    
    
    /**
     * 输入加减乘除表达式字符串,返回计算结果
     * @param expression 表达式字符串
     * @return 返回计算结果
     */
    public static double executeExpression(String expression) {
        // 非空校验
        if (null == expression || "".equals(expression.trim())) {
            throw new IllegalArgumentException("表达式不能为空!");
        }
        
        // 表达式字符合法性校验
        Matcher matcher = EXPRESSION_PATTERN.matcher(expression);
        if (!matcher.matches()) {
            throw new IllegalArgumentException("表达式含有非法字符!");
        }
        
        Stack<String> optStack = new Stack<>(); // 运算符栈
        Stack<BigDecimal> numStack = new Stack<>(); // 数值栈,数值以BigDecimal存储计算,避免精度计算问题
        StringBuilder curNumBuilder = new StringBuilder(16); // 当前正在读取中的数值字符追加器
        
        // 逐个读取字符,并根据运算符判断参与何种计算
        for (int i = 0; i < expression.length(); i++) {
            char c = expression.charAt(i);
            if (c != ' ') { // 空白字符直接丢弃掉
                if ((c >= '0' && c <= '9') || c == '.') {
                    curNumBuilder.append(c); // 持续读取一个数值的各个字符
                } else {
                    if (curNumBuilder.length() > 0) {
                        // 如果追加器有值,说明之前读取的字符是数值,而且此时已经完整读取完一个数值
                        numStack.push(new BigDecimal(curNumBuilder.toString()));
                        curNumBuilder.delete(0, curNumBuilder.length());
                    }
                    
                    String curOpt = String.valueOf(c);
                    if (optStack.empty()) {
                        // 运算符栈栈顶为空则直接入栈
                        optStack.push(curOpt);
                    } else {
                        if (curOpt.equals("(")) {
                            // 当前运算符为左括号,直接入运算符栈
                            optStack.push(curOpt);
                        } else if (curOpt.equals(")")) {
                            // 当前运算符为右括号,触发括号内的字表达式进行计算
                            directCalc(optStack, numStack, true);
                        } else if (curOpt.equals("=")) {
                            // 当前运算符为等号,触发整个表达式剩余计算,并返回总的计算结果
                            directCalc(optStack, numStack, false);
                            return numStack.pop().doubleValue();
                        } else {
                            // 当前运算符为加减乘除之一,要与栈顶运算符比较,判断是否要进行一次二元计算
                            compareAndCalc(optStack, numStack, curOpt);
                        }
                    }
                }
            }
        }
 
        // 表达式不是以等号结尾的场景
        if (curNumBuilder.length() > 0) {
            // 如果追加器有值,说明之前读取的字符是数值,而且此时已经完整读取完一个数值
            numStack.push(new BigDecimal(curNumBuilder.toString()));
        }
        directCalc(optStack, numStack, false);
        return numStack.pop().doubleValue();
    }
    
    /**
     * 拿当前运算符和栈顶运算符对比,如果栈顶运算符优先级高于或同级于当前运算符,
     * 则执行一次二元运算(递归比较并计算),否则当前运算符入栈
     * @param optStack 运算符栈
     * @param numStack 数值栈
     * @param curOpt 当前运算符
     */
    public static void compareAndCalc(Stack<String> optStack, Stack<BigDecimal> numStack, 
            String curOpt) {
        // 比较当前运算符和栈顶运算符的优先级
        String peekOpt = optStack.peek();
        int priority = getPriority(peekOpt, curOpt);
        if (priority == -1 || priority == 0) {
            // 栈顶运算符优先级大或同级,触发一次二元运算
            String opt = optStack.pop(); // 当前参与计算运算符
            BigDecimal num2 = numStack.pop(); // 当前参与计算数值2
            BigDecimal num1 = numStack.pop(); // 当前参与计算数值1
            BigDecimal bigDecimal = floatingPointCalc(opt, num1, num2);
            
            // 计算结果当做操作数入栈
            numStack.push(bigDecimal);
            
            // 运算完栈顶还有运算符,则还需要再次触发一次比较判断是否需要再次二元计算
            if (optStack.empty()) {
                optStack.push(curOpt);
            } else {
                compareAndCalc(optStack, numStack, curOpt);
            }
        } else {
            // 当前运算符优先级高,则直接入栈
            optStack.push(curOpt);
        }
    }
    
    /**
     * 遇到右括号和等号执行的连续计算操作(递归计算)
     * @param optStack 运算符栈
     * @param numStack 数值栈
     * @param isBracket true表示为括号类型计算
     */
    public static void directCalc(Stack<String> optStack, Stack<BigDecimal> numStack, 
            boolean isBracket) {
        String opt = optStack.pop(); // 当前参与计算运算符
        BigDecimal num2 = numStack.pop(); // 当前参与计算数值2
        BigDecimal num1 = numStack.pop(); // 当前参与计算数值1
        BigDecimal bigDecimal = floatingPointCalc(opt, num1, num2);
        
        // 计算结果当做操作数入栈
        numStack.push(bigDecimal);
        
        if (isBracket) {
            if ("(".equals(optStack.peek())) {
                // 括号类型则遇左括号停止计算,同时将左括号从栈中移除
                optStack.pop();
            } else {
                directCalc(optStack, numStack, isBracket);
            }
        } else {
            if (!optStack.empty()) {
                // 等号类型只要栈中还有运算符就继续计算
                directCalc(optStack, numStack, isBracket);
            }
        }
    }
    
    /**
     * 不丢失精度的二元运算,支持高精度计算
     * @param opt
     * @param num1
     * @param num2
     * @return
     */
    public static BigDecimal floatingPointCalc(String opt, BigDecimal bigDecimal1, 
            BigDecimal bigDecimal2) {
        BigDecimal resultBigDecimal = new BigDecimal(0);
        switch (opt) {
            case "+":
                resultBigDecimal = bigDecimal1.add(bigDecimal2);
                break;
            case "-":
                resultBigDecimal = bigDecimal1.subtract(bigDecimal2);
                break;
            case "*":
                resultBigDecimal = bigDecimal1.multiply(bigDecimal2);
                break;
            case "/":
                resultBigDecimal = bigDecimal1.divide(bigDecimal2, 10, BigDecimal.ROUND_HALF_DOWN); // 注意此处用法
                break;
            default:
                break;
        }
        return resultBigDecimal;
    }
    
    /**
     * priority = 0  表示两个运算符同级别
     * priority = 1  第二个运算符级别高,负数则相反
     * @param opt1
     * @param opt2
     * @return
     */
    public static int getPriority(String opt1, String opt2) {
        int priority = OPT_PRIORITY_MAP.get(opt2) - OPT_PRIORITY_MAP.get(opt1);
        return priority;
    }
 
    /**
     * 浮点数相等比较函数
     * @param value1
     * @param value2
     * @return
     */
    private static boolean isDoubleEquals (double value1, double value2) {
        System.out.println("正确结果=" + value1 + ", 实际计算结果=" + value2);
        return Math.abs(value1 - value2) <= 0.0001;
    }
    
    public static void main(String[] args) {
        // 几个测试数据
        System.out.println(isDoubleEquals(-39.5, executeExpression(" 2 + 3/2 * 3 - 4 *(2 + 5 -2*4/2+9) + 3 + (2*1)-3= ")));
        System.out.println(isDoubleEquals(60.3666, executeExpression("9*2+1/3*2-4+(3*2/5+3+3*6)+3*5-1+3+(4+5*1/2)=")));
        System.out.println(isDoubleEquals(372.8, executeExpression(" 9.2 *(20-1)-1+199 = ")));
        System.out.println(isDoubleEquals(372.8, executeExpression(" 9.2 *(20-1)-1+199  ")));
        System.out.println(isDoubleEquals(372.8, executeExpression(" 9.2 *(20-1)-1+199")));
        System.out.println(isDoubleEquals(-29, executeExpression(" 9 *(20-1)-(1+199) ")));
        System.out.println(isDoubleEquals(1.0E24, executeExpression("1000000000000*1000000000000 = ")));
    }
    
    private Calculator(){};
    
}

————————————————

原文链接:https://blog.youkuaiyun.com/moon_1991/article/details/80947858

实验四-运算符和表达式和输入输出格式控制 实验目的及要求: 初步了解循环结构,whlie ,do..while,for循环 能用循环结构编写简单程序 学习调试程序。 立即下载

相关推荐

AMD 3D V-Cache技术解析:CPU缓存堆叠如何突破性能瓶颈

在半导体领域,缓存(Cache)是提升处理器性能的关键技术,其核心原理是在高速CPU核心与慢速主存之间建立数据中转站,以缓解“内存墙”问题。随着摩尔定律放缓,传统平面扩展缓存面临面积成本高、延迟增加等挑战。3D封装技术应运而生,通过垂直堆叠实现极致的互联密度与带宽,成为突破性能瓶颈的重要工程路径。这项技术的价值在于能以更优的功耗和延迟,显著提升缓存容量,从而改善游戏、科学计算等数据密集型应用的性能。以AMD 3D V-Cache为代表的Hybrid Bonding(混合键合)工艺,正是这一趋势的典型实践,它

weixin_30432579的博客 417

javaSE语法基础

JavaSE语法基础

qq_42865964的博客 155

离线安装ambari 更换spark版本 集成carbondate文档

1、Linux系统环境配置 1.1 配置IP地址 vim /etc/sysconfig/network-script/ifcfg-eth0 “DEVICE”:网卡对应的设备别名,如ifcfg-eth0第一块网卡; “HWADDR”:网卡物理地址; “BOOTPROTO”:网卡获得ip地址的方式,Static(静态 ip地址)dhcp(通过dhcp协议获取ip)bootip通过boot...

weixin_44742962的博客 3036

Java基础-注释

作用 注释就是程序员为读者作的说明,是提高程序可读性的一种手段 类型 // 单行注释 注释内容从//到本行结尾 /* / 多行注释 / */ 注释不能嵌套 /** */文档注释 可以通过JDK提供的Javadoc命令,生成程序的API文档(面向对象编程时再讲) 注意 注释不会出现在字节码文件中。即Java编译器编译时会跳过注释语句。 代码示例 package *; /** * @prog...

逍遥云恋 628

WRF-BEM相关参数说明

本参数适用于WRF-BEM模拟武汉市气候。

m0_60013472的博客 1896

Edge主页被2345劫持?手动清理注册表与组策略的完整方案

浏览器主页劫持是Windows系统中常见的恶意篡改行为,其原理是通过修改注册表、快捷方式、组策略等多处系统配置,强制锁定浏览器启动页。这类劫持不仅影响上网体验,还可能带来隐私泄露和恶意软件感染风险。在安全防护与系统优化场景中,掌握手动清理主页劫持的技能至关重要。本文针对Edge主页被2345导航劫持的问题,深入解析劫持入口,提供从快捷方式、注册表到组策略的逐层清理步骤,并给出防复发策略,帮助用户彻底摆脱顽固劫持。

weixin_30582943的博客 384

python学习笔记---函数

对于函数,简单理解为完成某项工作的代码块,类似于积木块,可以反复使用。 1.创建和调用函数 创建函数语法格式为 def functionname(parameter): 调用函数语法格式为 functionname(paremeter) 2.参数传递 ①形参和实参:定义或创建函数时,函数参数为形参;调用函数时,函数参数为实参。(这样理解,在定义函数时,不知道具体的输入是什么,这时的参数只是个形式,相当于自变量x;调用函数时,需要给定具体的输入,这时的参数就有了具体值,相当于自变量x有了具体的...

自定义的博客 271

标准论文参考文献添加方法——Zotero入门使用教程

第一篇论文投出去了,写一下最后一步的参考文献修饰润色吧! 论文的参考文献,即References,是论文的最后一步,相信不管是写毕设论文还是期刊论文都遇到过需要修改参考文献的情况,非常之麻烦。而且参考文献中经常会与生僻奇怪气体出现,一个一个修改非常浪费时间,这里介绍一下一个非常好用的软件Zetero。 第一步:软件的下载安装及绑定Word 尽量使用客户端吧,

MISAYAONE的博客 20万+

list和forward_list不支持运算符操作_做为java编程员连这 5 类「运算符」都不理解,只能劝你转行了!...

如果说你连运算符都还搞不清楚的话。。。。。。那么小编只能劝你转行了!运算符最主要有以下五类运算符:1.算术运算符2.关系运算符3.逻辑运算符4.赋值运算符5.条件运算符我们先来讲第一个1算术运算符关于算术运算符我列了一个表(如下图)算术运算符又包括一元算术运算符和二算元术运算符。一元运算符,只有一个操作数。二元运算符,有两个操作数,运算符在两个操作数之间。先看看一元运算符:"-"取负值;“++”和...

weixin_39929602的博客 314

【实战】Python 携程酒店价格实时抓取爬虫项目全解析

摘要:本文介绍了一个基于Python的携程酒店价格实时抓取系统开发方案。系统采用Requests、BeautifulSoup和Selenium等技术栈,实现了多城市、多日期的酒店数据采集,包括价格、评分、位置等关键信息。通过请求头伪装、IP代理、随机等待等反爬策略,有效应对携程的反爬机制。系统支持数据清洗、去重和CSV/Excel导出,并提供了多线程优化、代理池集成等进阶方案。本文详细阐述了技术原理、代码实现和优化策略,同时强调了数据采集的合法合规性,为旅游行业数据分析提供了可靠的数据获取方案。

2503_91057718的博客 2605

YOLOv13保姆级教程+AKConv模块:可变形卷积+自适应核优化,mAP提升3.23%,召回率&mAP50~95显著提升(论文涨点模块已验证)

本文介绍了一种改进的YOLOv13-AKConv模型,通过引入AKConv模块显著提升了目标检测性能。实验结果表明,优化后的模型(绿色曲线)相比原模型(蓝色曲线)在mAP指标上提升了3.23个点,同时召回率、mAP50-95等指标均有明显提升。作者详细阐述了模型移植过程,包括创建yolov13-AKConv.yaml配置文件,修改tasks.py和modules/init.py文件,以及实现AKConv模块的核心代码。该模块采用可变形卷积思想,通过动态生成采样点位置来增强特征提取能力,并集成了BN和SiLU

FJN110的博客 2611

Java 算术运算符++和--的用法

1、单独使用:放在操作数的前面和后面效果一样。(这种用法是我们比较常见的) 2、参与运算使用: 放在操作数的前面(++a):先自增或自减,然后再参与运算。 放在操作数的后面(a++):先参与运算,再自增或自减。 3、参与运算例子: public static void main(String[] args){ int a = 3; int b; b = a++; System.out.println(b); //输出:3 System/out.println(a); //输出:4 } 当++

单枪匹码 920

【100%通过率】华为OD机试真题2026双机位C卷 C语言 实现【加密算法】

【100%通过率】华为OD机试真题2026双机位C卷 Python&JS 实现【加密算法】有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下

MISAYAONE的博客 648

java算数运算符

算数运算符 运算符 运算 示例 结果 + 正号 +3 3 + 加 1+1 2 + 字符串相加(拼接) “He”+“llo” Hello - 负号 b = 4; -b -4 - 减 2-1 1 * 乘 1*2 2 / 除 2/2 1 % 取模 7%5 2 ++ 自增:++在前,++在后 案例 - - - 自减:- -在前,- - 在后 案例 - ...

simon的博客 502

深度学习工具包 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")

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

10、算数运算符(以 ‘/’、‘%’、‘++’为主去讲解)(Java超详细版本)

我们要知道,在Java中,当变量参与运算的时候,系统会把这个变量存入一个临时的空间,称之为“ 操作数栈 ”,我们也不讲那么详细,因为本博主也不会那么多😄,所以直接拿“ ++ ”进行举例吧。

颜安青的小世界 1690

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java运算符详解

所以,对于上述例子,第一段代码是先对b进行赋值运算,再自增,故a=1,b=2;但是在第二段代码中,是先对a进行自增运算,此时a的值为2,再进行赋值,故b的值为2。分析:由于a==b的值为false,&&便不会执行后面的代码,所以a=1。分析:由于a==b的值为true,&&便会执行后面的代码,所以a=2。自减运算符:--a(前置自减),a--(后置自减)自增运算符:++a(前置自增),a++(后置自增)算术运算符有:+=,-=,*=,/=,%=通俗来说,关系运算符主要功能时进行判断。

m0_62404808的博客 1871

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java运算符的使用和规则

本篇文章为本人学习笔记,如有错误,希望指正。 Java中运算符大致分为以下几类: 算数运算符 赋值运算符 自增自减运算符 关系运算符 逻辑运算符 三元运算符 1. 算数运算符 算数运算符包括: 作用 + 加法运算,字符串连接运算 - 减法运算 * 乘法运算 / 除法运算 % 取模运算,两个数字相除取余数 注意:/和%的区别:两个数据做除法,/取结果的商,%取结果的余数。 整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。 1.1 字符串的 + 操作.

Aunero的博客 1957

算数运算符&关系运算符

System.out.println("合"+ weeks + "个星期," + leftDays +"天");规则使用临时变量:(1)临时变量=i;规则使用变量:(1)i=i+1;//java中 10 / 4 =2,2=>2.0。//在%的本质 看一个公式 a % b = a - a / b * b。//自增 等价于 i = i + 1;//自增 等价于 i = i + 1;(2)根据给出的公式,进行计算即可5/9*(华氏温度-100)

m0_59324769的博客 265

Java语言学习笔记-【04运算符、算数、关系、逻辑、赋值...】

**算数运算符**+ **赋值运算符**+ **关系运算符[比较运算符]**+ **逻辑运算符**+ **位运算符[需要二进制基础]**+ **三元运算符**

qq_67947670的博客 911

0基础java入门:第九节.Java中运算符号

1. 表达式 2. Java中的运算符号分类 3. Java运算符号详解 4. 表达式的自动提升 5. 运算符号的优先级

MrTeacherZ的博客 811

java的运算符以及二进制相关知识

java里面也有自增自减! 注意,取模的本质就是 res = a - a / b * b,这样就会分析正负号了! 面试: 观察字节码.class文件,就明白原理了 2. 关系运算符 两者在运算结果上没有区别,但是短路与在第一个条件为false的时候,就不会再进行后面条件判断,所以效率更高,开发上通常使用短路逻辑运算符。类似的,第一个条件为true时,短路或就不进行后面的条件判断了,但是逻辑或会继续判断,所以短路或效率高,我们通常使用短路或。

qq_48973099的博客 2091

谈谈Java语言中的运算符

一、运算符概念 运算符是一些特殊的符号,主要用于数学函数、一些类型的赋值语句和逻辑比较方面。Java中提供了丰富的运算符,如赋值运算符、算数运算符、比较运算符、三元运算符等。。 1、算数运算符 1.1、Java中的算数运算符主要有+(加)、-(减)、*(乘以)、/(除以)、%(求余),他们都是二元运算符,Java中算数运算符的功能及使用方式如下表 运算符 说明 实例 结果...

未来的路 257

Java之算数运算符

运算符 运算符介绍 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。 1)算术运算符 2)赋值运算符 3)关系运算符文章目录运算符运算符介绍1. 算数运算符1.1 介绍1.2 算术运算符一览1.3 案例演示 1. 算数运算符 1.1 介绍 1.2 算术运算符一览 1.3 案例演示 ...

兮动人 668

java 中的运算符

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

2401_83641443的博客 710

Java中的运算符

Java中的运算符分为四类: 算数运算符:+ - * / % ++ -- 关系运算符:> >= == <= < != 逻辑运算符:&& & || | ! ^ 位运算符:& | ~ ^ >> << >>> 算数运算符和关系运算符比较简单不进行赘述了!~~~ 逻辑运算符: 注意:逻辑运算符操作的都是boolean类型的变量,而且结果也是boolean...

baidu_28370189的博客 197

Java基础之运算符(算数运算符和赋值运算符)

Java的基础知识 运算符的操作

Fly的博客 3011
上一篇: Address already in use: bind JVM端口被占用解决方法
下一篇: 帆软实现单元格可编辑内容并保存
mmm.c
博客等级 码龄9年 117粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值