Puzzel2:Time for a Change

科技中介服务机构如何降低技术评价服务成本?.docx 科技中介服务机构如何降低技术评价服务成本? 立即下载

Consider the following word problem:

 

考虑以下word problem:

Tom goes to the auto parts store to buy a spark plug that costs $1.10, but all he has in his wallet are two-dollar bills. How much change should he get if he pays for the spark plug with a two-dollar bill?

 

Tom去汽车配件店买一个价格为 $1.10的火花塞,但他口袋里只有一张两美元的钞票。如果他用这些钱买火花塞会得到多少找零?

Here is a program that attempts to solve the word problem. What does it print?

 

这里是一个企图解决此问题的程序,它会打印出什么?

public class Change {

    public static void main(String args[]) {

        System.out.println(2.00 - 1.10);

    }

}


Solution 2: Time for a Change

Naively, you might expect the program to print 0.90, but how could it know that you wanted two digits after the decimal point? If you know something about the rules for converting double values to strings, which are specified by the documentation for Double.toString [Java-API], you know that the program prints the shortest decimal fraction sufficient to distinguish the double value from its nearest neighbor, with at least one digit before and after the decimal point. It seems reasonable, then, that the program should print 0.9. Reasonable, perhaps, but not correct. If you ran the program, you found that it prints 0.8999999999999999.

 

你也许会天真地期待程序打印出 0.90,但是程序怎么知道你希望得到小数点后两位数?如果你知道一些double型转换为string型的规则,在java-api文档里有详细的double.tostring说明[Java-API],,你了解到程序打印出最短十进制片段,这个数字片段足够与其最近的邻居区别开来,并且在小数点前后各有至少一位。看上去很合理,那么程序应当打印出0.9。合理的,可能是,但不正确。如果你跑这段程序,你发现它打印出0.8999999999999999。

The problem is that the number 1.1 can't be represented exactly as a double, so it is represented by the closest double value. The program subtracts this value from 2. Unfortunately, the result of this calculation is not the closest double value to 0.9. The shortest representation of the resulting double value is the hideous number that you see printed.

 

问题其实是数字1.1作为double型数据不能被精确表现,所以它其实是被一个最近似的double值来表现。程序从2减去这个值。计算结果不幸不是0.9的最近似值。结果最短表现值是你看到的令人惊讶的数字。

 

More generally, the problem is that not all decimals can be represented exactly using binary floating-point. If you are using release 5.0 or a later release, you might be tempted to fix the program by using the printf facility to set the precision of the output:

更一般的,问题是用二进制浮点不能精确表现所有十进制数。如果你用了5.0或以上的版本,你可以用print facility来修正程序设置它的输出精度
// Poor solution - still uses binary floating-point!
//差劲的解法-仍然使用二进制浮点

System.out.printf("%.2f%n", 2.00 - 1.10);

This prints the right answer but does not represent a general solution to the underlying problem: It still uses double arithmetic, which is binary floating-point. Floating-point arithmetic provides good approximations over a wide range of values but does not generally yield exact results. Binary floating-point is particularly ill-suited to monetary calculations, as it is impossible to represent 0.1—or any other negative power of 10—exactly as a finite-length binary fraction [EJ Item 31].

 

这将打印正确的结果但并未对根本问题有一般的解决;它仍然用二进制浮点的double运算。浮点运算提供了广泛的好的近似但并不会一般性的得出精确的结果。二进制浮点尤其不合适货币计算,因为不可能将0.1或其它任何10的负数次方数精确表现为有限长度的二进制片段。[EJ Item 31].

 

One way to solve the problem is to use an integral type, such as int or long, and to perform the computation in cents. If you go this route, make sure the integral type is large enough to represent all the values you will use in your program. For this puzzle, int is ample. Here is how the println looks if we rewrite it using int values to represent monetary values in cents. This version prints 90 cents, which is the right answer:

 

解决此问题的一个方法是用整型数据,如int或long,且用cents执行计算。如果你这么做,确保整型足够大来表现所有你将在程序中用到的值。这个谜题中,int足够了。下面是如何使用int值来表现cents的数值来重新写程序,用println看结果。这个版本打印出90 cents,这是个正确的结果。

System.out.println((200 - 110) + " cents");

 

Another way to solve the problem is to use BigDecimal, which performs exact decimal arithmetic. It also interoperates with the SQL DECIMAL type via JDBC. There is one caveat: Always use the BigDecimal(String) constructor, never BigDecimal(double). The latter constructor creates an instance with the exact value of its argument: new BigDecimal(.1) returns a BigDecimal representing 0.1000000000000000055511151231257827021181583404541015625. Using BigDecimal correctly, the program

 

另一方法是用bigdecimal,它执行精确十进制运算。它通过jdbc与sql的decimal类型互相操作。有一个附加说明:总是用bigdecimal(string),绝不用bigdecimal(double)。后者创建一个其参数的精确实例;new BigDecimal(.1)返回一个BigDecimal表现为:0.1000000000000000055511151231257827021181583404541015625。正确使用BigDecimal,程序为:

 

prints the expected result of 0.90:

import java.math.BigDecimal;

public class Change {

    public static void main(String args[]) {

        System.out.println(new BigDecimal("2.00").

                           subtract(new BigDecimal("1.10")));

    }

}

 

This version is not terribly pretty, as Java provides no linguistic support for BigDecimal. Calculations with BigDecimal are also likely to be slower than those with any primitive type, which might be an issue for some programs that make heavy use of decimal calculations. It is of no consequence for most programs.

 

这个版本不是非常漂亮,因为java对BigDecimal提供no linguistic的支持。BigDeimal的计算都比那些使用原始数据类型的要慢,这也许会是某些程序大量使用decimal计算时的问题。这是大多数程序的重点。

 

In summary, avoid float and double where exact answers are required; for monetary calculations, use int, long, or BigDecimal. For language designers, consider providing linguistic support for decimal arithmetic. One approach is to offer limited support for operator overloading, so that arithmetic operators can be made to work with numerical reference types, such as BigDecimal. Another approach is to provide a primitive decimal type, as did COBOL and PL/I.

 

总而言之,需要精确结果时避免float与double;对于货币计算,用int,long或BigDecimal。对于语言设计者,考虑对BigDecimal运算提供linguistic支持。一个方法是提供对操作符重载提供有限支持,这样一来运算符能够被用来与数字相关类型,如BigDecimal。另一方法是提供十进制数的原始数据类型,就如同COBOL和PL/I中那样。

产业园区运营负责人如何提升园区企业创新能级与科技成果转化率?.docx 科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载

相关推荐

学习路之Java-若依ruoyi接入ai实现模型对话

学习路之Java-若依ruoyi接入ai实现模型对话

OGG 整理简洁笔记 I

Oracle GoldenGate 包括goldengate 、goldengate director(goldengate management pack) 、goldengate veridata    其中,goldengate director 为其提供GUI配置界面。goldengate veridata 为其提供源端-目标端数据比对和校验功能。 架构:  1  m

上帝之手&传奇 - MartinLee 1216

科技中介服务机构如何利用数智工具提升服务效率与客户粘性.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

GoldenGate配置(四)之veridata配置

GoldenGate配置(四)之veridata配置 环境: Item Source System Target System Platform Red Hat Enterprise Linux Server release 5.4 Red Hat Enterprise Linux Serve

深蓝@黄炎龙 3466

状态估计【扩展卡尔曼滤波算法的神经网络训练】BP神经网络、扩展卡尔曼滤波EKF+BP、粒子滤波PF轨迹估计研究(Matlab代码实现)

内容概要:本文围绕状态估计与神经网络融合技术展开研究,重点介绍了扩展卡尔曼滤波(EKF)与BP神经网络的联合算法(EKF+BP)以及粒子滤波(PF)在轨迹估计中的应用。资源基于Matlab/Simulink平台,提供了BP神经网络、EKF+BP融合算法和PF的完整代码实现,旨在通过仿真手段提升非线性系统的状态估计精度。文中不仅涵盖了卡尔曼滤波系列(如UKF、EKF、PF)的基本原理与实现方法,还展示了其在风电预测、电池寿命预测、无人机状态估计、雷达跟踪等领域的广泛应用,突出其在复杂动态系统建模与轨迹预测中的实用价值。; 适合人群:具备一定Matlab编程基础,从事自动化、控制工程、电气工程、人工智能及相关领域的研究生、科研人员和工程技术人员。; 使用场景及目标:①深入理解并掌握扩展卡尔曼滤波与BP神经网络融合的建模机制与实现流程;②开展非线性系统的状态估计与动态轨迹跟踪仿真研究;③应用于无人机导航、机器人定位、电力系统状态监测、信号处理等领域的算法开发与系统优化。; 阅读建议:本资源以Matlab代码为核心,建议读者结合提供的仿真模型与参考文献动手实践,重点关注EKF与BP网络的参数配置、融合策略设计及滤波性能对比,通过比较UKF、EKF与PF等不同滤波算法的估计效果,深化对状态估计算法优劣与适用场景的理解。

单相PWM整流器基于直流电流控制+虚拟dq两种闭环控制仿真【2个仿真+参考资料】

内容概要:本文详细介绍了单相PWM整流器基于直流电流控制与虚拟dq两种闭环控制的仿真研究,包含两个完整的Simulink仿真模型及相关参考资料。通过构建控制系统模型,分别实现对直流电流的直接调节和在虚拟dq坐标系下的解耦控制,旨在提高整流器的动态响应性能与稳态精度,同时确保单位功率因数运行。文中系统阐述了两种控制策略的设计原理、坐标变换机制、PI调节器参数整定方法及系统稳定性分析,并通过仿真结果对比验证了各自在动态响应、抗干扰能力和稳态误差等方面的性能特点,充分展示了其在现代电力电子系统中的适用性与优势。; 适合人群:具备电力电子与电力传动基础知识,熟悉Simulink仿真环境,从事新能源变换器、PFC控制或电机驱动等相关领域研究的研究生、工程师及科研人员。; 使用场景及目标:①掌握单相PWM整流器的基本工作原理与数学建模方法;②学习并比较直流电流控制与虚拟dq控制两种主流闭环控制策略的设计流程与性能差异;③应用于实际项目中如充电桩、光伏逆变器、UPS等场合的控制系统开发与优化。; 阅读建议:建议结合提供的仿真模型边操作边学习,重点关注控制框图搭建、坐标变换模块实现及PI参数调试过程,同时参考相关文献深入理解控制理论背景,以提升实际工程应用能力。

操作系统时间改变之后,OGG Veridata应该进行的处理步骤

OGG Veridata

msdnchina的专栏@JiNan,ShanDong 1061

高校技术转移办公室人员如何高效筛选优质科技成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

veridata实验举例(6)验证agent启动先后顺序是否对捕获update操作有影响

veridata实验举例(6)验证agent启动先后顺序是否对捕获update操作有影响 续接veridata实验系列  上篇:“veridata实验举例(5)修改主键上的列值,update操作会被拆分成两条语句”,地址:点击打开链接 环境: Item Source System Target System Platform

深蓝@黄炎龙 1627

两相交错并联Boost电路仿真模型(Simulink仿真实现)

内容概要:本文详细介绍了“两相交错并联Boost电路仿真模型(Simulink仿真实现)”这一电力电子系统仿真资源,隶属于一个涵盖多种主流电力变换器拓扑与先进控制策略的综合性仿真资料库。该资料库以Simulink为主要仿真平台,集成了2.5kW双相交错并联Boost电路、全桥/半桥LLC谐振变换器、双向CLLC、三相维也纳(Vienna)PFC、图腾柱PFC等多种典型电路的仿真模型与配套设计资料。其核心技术不仅包括开环、闭环、软启动、双闭环PI控制等基础控制方法,更深入涵盖了中点电位平衡、恒压恒流双竞争闭环、变频与移相混合控制、模型预测控制(FCS-MPC)等前沿控制算法的实现。此外,资源体系还整合了Mathcad计算书、参数设计报告、PPT说明文档等,构建了从理论推导、参数设计到仿真验证的完整闭环,充分体现了理论与实践的高度融合。; 适合人群:具备扎实的电力电子技术与自动控制理论基础,从事新能源发电、电力变换、工业电源、电动汽车等领域研究与开发的研究生、科研人员及研发工程师。; 使用场景及目标:①系统学习并复现各类DC-DC、AC-DC变换器(如Boost、LLC、Vienna PFC等)的工作原理与核心控制策略;②开展电力电子系统相关的科研项目,支撑拓扑结构创新、控制算法优化、关键参数设计与系统性能验证等工作;③作为毕业设计、课程大作业或工程项目开发的标准化参考模板。; 阅读建议:此资源以仿真为核心,强调理论分析与工程实践的紧密结合。使用者应结合所提供的Mathcad计算书与设计报告,深入理解电路参数的设计依据和控制策略的实现逻辑,并在Simulink环境中动手调试模型,通过细致观察波形变化、定量分析数据结果,来深化对电力电子系统动态特性与稳态性能的理解。

三相电压型PWM整流器PI双闭环控制Matlab仿真

内容概要:本文围绕三相三电平VIENNA整流器的双闭环控制与中点电位平衡问题展开研究,提出一种基于电压电流双闭环PI控制结合电容电压差值补偿的中点电位平衡策略。系统采用同步旋转坐标系下的双闭环控制结构,电压外环用于稳定直流母线电压,电流内环实现输入电流的快速跟踪与单位功率因数运行。针对VIENNA整流器直流侧上下电容电压不平衡的问题,引入电容电压差值Δu作为反馈信号,在SVPWM调制中利用冗余小矢量的时间分配自由度,动态调节中点电荷流动,实现中点电位的主动均衡。仿真结果表明,该方法在800V直流母线电压下,不仅实现了母线电压的稳定跟踪和输入电流低谐波(THD低),而且显著提升了上下电容电压的均衡度,有效抑制了中点电位的漂移。; 适合人群:具备电力电子、自动控制理论基础的电气工程及相关专业研究生、科研人员及从事新能源、电动汽车充电桩、工业电源等领域的研发工程师。; 使用场景及目标:① 掌握三相VIENNA整流器的工作原理与数学建模方法;② 学习双闭环PI控制器的设计与参数整定技巧;③ 理解中点电位不平衡的成因,并掌握基于SVPWM冗余矢量的主动平衡控制策略;④ 通过Matlab/Simulink仿真平台复现并验证所提控制策略的有效性,服务于高性能PFC整流器的研发与优化。; 阅读建议:建议读者结合文中提供的控制框图与仿真参数,动手搭建Simulink模型,重点关注SVPWM模块中冗余矢量作用时间的调节逻辑。在学习过程中,应深入理解PI控制器带宽匹配、中点平衡控制边界及SVPWM谐波性能之间的内在联系,并尝试在不同负载和动态工况下测试系统的鲁棒性。

高校技术转移办公室人员如何通过平台实现科技成果的精准推介与转化路径规划?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

论文复现基于改进型混合有限集模型预测控制(FCS-MPC)的模块化多电平换流器MMC环流抑制与相间电压均衡控制研究(Simulink仿真实现)

内容概要:本文针对模块化多电平换流器(MMC)在运行过程中存在的环流分量抑制困难与相间子模块电压不均衡问题,提出了一种改进型混合有限集模型预测控制(FCS-MPC)策略,并通过MATLAB/Simulink平台完成了完整的系统建模仿真与控制算法验证。该方法在传统FCS-MPC基础上优化了控制律设计,通过构建精确的MMC数学模型,结合预测时域内的系统行为预测,动态选择最优开关状态序列,在单一控制框架下同步实现环流的有效抑制与各相间电压的均衡控制。仿真结果表明,所提策略在动态响应速度、稳态控制精度及抗干扰能力方面均表现出优越性能,相较于传统PI控制或固定模式调制方法,显著降低了环流幅值,提升了系统运行效率与稳定性。同时,文中详尽阐述了预测模型构建、代价函数设计、权重系数整定及多目标协调优化等关键技术环节,为电力电子系统中高性能预测控制的应用提供了完整的理论分析与实践范例。; 适合人群:具备电力电子、自动控制或电气工程等相关专业背景,从事模块化多电平换流器、高压直流输电、新能源并网、柔性交流输电系统等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决MMC拓扑中环流抑制与电压均衡控制的关键技术难题;②深入学习和掌握模型预测控制(MPC)在电力电子变换器中的高级应用方法与工程实现路径;③为相关课题的学术论文复现、控制算法改进及实际工程化落地提供可靠的技术参考与仿真模型支持。; 阅读建议:此资源以Simulink仿真实现为核心载体,不仅包含严谨的控制算法理论推导,还配套提供了可运行的仿真模型与参数设置说明,建议读者在系统理解MMC工作原理与MPC控制思想的基础上,动手复现并调试仿真模型,结合文中所述的实验结果进行对比分析,以深入掌握FCS-MPC的调控机制与多目标优化设计精髓。

三相三电平VIENNA整流器双闭环设计与中点电压均衡控制仿真(Simulink仿真实现)

内容概要:本文针对三相三电平VIENNA整流器,系统研究了其双闭环控制系统设计与中点电压均衡控制策略。采用电压外环与电流内环构成的双闭环PI控制结构,实现对800V直流母线电压的稳定跟踪与快速响应,确保单位功率因数运行和输入电流的低谐波特性。针对三电平拓扑固有的中点电位失衡问题,提出了一种基于上下电容电压差值补偿的主动均衡控制方法,该方法将电压偏差信号引入调制环节,结合空间矢量脉宽调制(SVPWM)技术,充分利用冗余小矢量的时间分配自由度,实现对中点电荷的定向调节。基于MATLAB/Simulink平台构建了完整的仿真模型,结果表明,在800V直流母线电压工况下,所提控制策略不仅能够精确稳定母线电压,还能显著提升中点电容电压的均衡度,同时将输入电流总谐波畸变率(THD)控制在较低水平,成功实现了电压稳定、电流低谐波与中点电位均衡的协同控制目标。; 适合人群:具备电力电子与电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事新能源变换器、整流器控制研究的研发人员与高校研究生。; 使用场景及目标:①掌握VIENNA整流器双闭环PI控制器的设计流程与参数整定方法,理解内外环带宽匹配的重要性;②深入理解中点电位失衡的物理机理及基于电压差值补偿的均衡控制原理;③学习SVPWM在三电平拓扑中的具体应用,掌握其与中点平衡控制的协同工作机制;④通过复现并调试仿真模型,验证控制策略的有效性,用于支撑科研项目或工程原型开发。; 阅读建议:在学习过程中应紧密结合提供的仿真模型,重点关注电压外环与电流内环的参数设计与动态响应特性,深入分析差值补偿环节的增益设置对中点电压动态性能的影响。建议通过对比实验,观察投入与未投入中点平衡控制时的电容电压波形差异,以直观理解该策略的优越性,并尝试在不同负载条件下测试系统的鲁棒性,从而全面把握控制策略的有效性与应用边界。

高校技术转移办公室人员如何利用平台有效识别具有市场潜力的科技成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

三相充电桩维也纳PFC+三电平LLC谐振变换器三电平PSIM仿真设计(Simulink仿真实现)

内容概要:本文针对三相充电桩中的维也纳PFC(功率因数校正)与三电平LLC谐振变换器,开展基于Simulink的系统级仿真设计研究。重点构建了三电平维也纳整流器的电压电流双闭环PI控制模型,并创新性地在电压外环中引入直流侧上下电容电压差值补偿机制,结合SVPWM调制策略,有效解决了三电平拓扑固有的中点电位不平衡问题。仿真结果表明,该控制策略不仅能稳定输出800V直流母线电压,还能显著提升上下电容电压的均衡度,同时保持输入电流低谐波(THD低),验证了“电压稳定—电流低谐波—中点均衡”多重目标协同实现的可行性。此外,该资源包还涵盖了图腾柱PFC、多种LLC变换器(半桥、全桥、双向、交错并联)的闭环控制与软开关仿真,以及参数设计报告、计算书和参考文献,形成了完整的电力电子变换器仿真技术体系。; 适合人群:电气工程、自动化、电力电子等相关专业的研究生、科研人员及从事新能源汽车充电、工业电源研发的工程师。; 使用场景及目标:①掌握三电平维也纳PFC的双闭环控制与中点电位平衡核心技术;②学习LLC谐振变换器的建模、参数设计与闭环控制方法;③利用Simulink进行电力电子系统的仿真验证与性能优化,服务于科研项目、毕业设计或产品开发。; 阅读建议:此资源以Simulink/Matlab仿真为核心,理论与实践紧密结合。建议读者在理解双闭环PI控制、SVPWM调制和中点平衡原理的基础上,动手复现仿真模型,通过调整PI参数、观察中点电压波形,深入理解控制策略的动态响应与调节机理。同时,可参考配套的计算书和设计报告,将仿真结果与理论计算相互印证,全面提升系统设计与分析能力。

上一篇: 第一周
下一篇: 工作笔记
sslf
博客等级 码龄23年 2粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值