Lazarus分数计算

2024-01-27 18:08
文章标签 计算 lazarus 分数

本文主要是介绍Lazarus分数计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分数

Fractions 是使用分数进行计算的单元。 .

一、TFraction类型

TFraction是“高级记录”:具有方法和属性的记录。

二、TFraction属性

2.1分子属性Numerator :Int64;

获取或设置分子部分

2.2分母属性Denominator: Int64;

获取或设置分母部分

尝试设置分母为0,会弹出 EZeroDivide异常

三、TFraction方法

3.1Normalize;

通过将分子和Dominatr除以它们的最大公约数来收缩分数 例如 10/5 变为2/1

3.2ToString:String;

返回分数的字符串表示形式(不执行收缩), 例如当分子Numerator = 10 并且分母 Denominator = 5, 该函数返回 '10/5'

3.3 Resolve: String;

返回分数收缩后的字符串表示形式,例如,当分子Numerator = 4并且分母Denominator = 3, 函数返回'1 1/3'

3.4function ToFloat:Double;

返回分数的浮点表示形式,例如,当分子 Numerator = 1并且分母Denominator = 3, 函数返回 0.3333333333333

四、分配和创建分数

  1. function Fraction(ANumerator, ADenominator: Int64): TFraction;

创建分数,例如Fraction(1,2) 代表 分数1/2

  1. function Fraction(AIntPart, ANumerator, ADenominator: Int64): TFraction;

创建分数,例如 Fraction(1,1,2) 代表分数 1 1/2

五、支持的计算

重载运算符

  1. =(等于)

  2. <(少于)

  3. >(大于 )

  4. <=(小于或等于)

  5. > =(大于或等于)

  6. :=(赋值):此运算符允许在右侧使用Int64或String

  7. +(加)

  8. -(减)

  9. *(乘):对于分数和Int64重载

  10. /(除):对于分数和Int64重载

  11. **(幂):仅允许整数(在右侧)

六、数学函数

  1. 函数Min(a,b:TFraction):TFraction;inline;overload;

返回一个if(a <= b),否则重新运行b

  1. 函数Max(a,b:TFraction):TFraction;nline;overload;;

返回一个if(a> = b),否则返回b

  1. 函数InRange(const AValue,AMin,AMax:TFraction):boolean;nline;overload;;

返回真,如果(安勤> = AMIN)和(安勤<= AMAX),否则返回假

  1. 函数功能sureRange(const AValue,AMin,AMax:TFraction):TFraction;nline;overload;

如果(AValue <AMin),则返回AMin;如果(AValue> AMax),则返回AMax;否则,返回AValue

  1. 函数Sign(const AValue:TFraction):TValueSign;inline;overload;;

如果(AValue <0)则重新运行NegativeValue,如果(AValue> 0)则返回PositiveValue,否则返回ZeroValue

  1. 函数IsZero(const AValue:TFraction):boolean;overload;;

如果(AValue = 0)返回True,否则返回False

  1. 函数Abs(const AValue:TFraction):TFraction;overload;

如果(AValue> = 0)返回AValue,否则返回-AValue;

七、通用函数

  1. function GreatestCommonDivisor(a, b: Int64): Int64;

返回ab最大除数

  1. function Floor(D: Double): Int64; overload;

返回D的整数部分 (subtracted with 1, if (D < 0))

八、转换函数

  1. 函数FloatToFraction(Value,Precision:Double):TFraction;

以分数形式返回Value的近似值,例如FloatTofraction(0.5,0.01)返回1/2(一半)

精度定义了可接受的值(Abs(Result)-Abs(Value)<= Precision。

精度与值的关系最大为15

FloatToFraction实际上是一个函数变量,它已初始化为MF_FloatTofraction()函数。您可以根据需要分配自己的功能。

  1. 函数TryFloatToFraction(Value,Precision:Double; out F:TFraction; AcceptPrecisionError:Boolean):boolean;

返回值取决于AcceptPrecisionError值:

如果(AcceptPrecisionError = True),则如果可以找到近似值,则该函数将重新运行True

如果(AcceptPrecisionError = False)如果可以找到近似值,则函数返回True,并且Abs(Abs(Result)-Abs(Value))<=精度

仅当函数返回True时F的值才有意义

  1. 函数FloatToFractionDef(Value,Precision:Double; Def:TFraction; AcceptPrecisionError:Boolean):TFraction;

如果TryFloatToFraction(Value,Precision,F,AcceptPrecisionError:Boolean)成功,则返回找到的近似值(F),否则返回Def

  1. 函数StrToFraction(const S:String):TFraction;

返回以S表示的分数,失败时引发EConvertError

  1. 函数TryStrToFraction(const S:String; out F:TFraction):布尔值;

如果S可以转换为分数,则重新运行True,否则返回False

F的值仅在f函数返回True时才有意义

  1. 函数StrToFractionDef(const S:String; Def:TFraction):TFraction;

如果转换成功,则返回以S表示的分数,否则返回Def

九、示例

program example;{$mode objfpc}{$H+}
{$apptype console}uses
  Classes, sysutils, fractions, math;var
  F1, F2: TFraction;
  D, Prec: Double;
  i: Integer;
begin
  F1 := Fraction(1,1,3); // 1 1/3
  F2 := Fraction(4,3);   // 4/3
  writeln('F1.ToString = ',F1.ToString); // '4/3'
  writeln('F1.Resolve  = ',F1.Resolve);  // '1 1/3'
  writeln('F1.ToFloat  = ',F1.ToFloat:16:16); // 1.3333333333333333
  writeln('F2.ToString = ',F2.ToString); // '4/3'
  writeln('(F1 = F2)   = ',F1=F2);         //True  F1 := Fraction(1,2);
  F2 := Fraction(1,3);
  writeln(F1.ToString,' * ',F2.ToString,'   = ',(F1*F2).Resolve);  // '1/6'
  writeln(F1.ToString,' / ',F2.ToString,'   = ',(F1/F2).Resolve);  // '1 1/2'
  writeln(F1.ToString,' + ',F2.ToString,'   = ',(F1+F2).Resolve);  // '5/6'
  writeln(F1.ToString,' - ',F2.ToString,'   = ',(F1-F2).Resolve);  // '1/6'
  writeln(F1.ToString,' ** 2    = ',(F1**2).Resolve);  // '1/6'  D := 0.25;
  F1 := FloatToFraction(D, 0.000001);
  writeln('FloatTofraction(0.25) -> ',F1.ToString);   // '1/4'
  writeln;
  writeln('Approximations of Pi:');
  writeln('                                              [Pi = ',Pi:16:16,']');
  Prec := 1.0;
  for i := 1 to 10 do
  begin
    Prec := Prec / 10;
    F2 := FloatTofraction(Pi, Prec);
    writeln('FloatTofraction(Pi,',Prec:10:10,') = ',Format('%-13s',[F2.Resolve]),'   [',F2.ToFloat:16:16,']');
  end;
end.{$mode objfpc}{$H+}
{$apptype console}uses
  Classes, sysutils, fractions, math;var
  F1, F2: TFraction;
  D, Prec: Double;
  i: Integer;
begin
  F1 := Fraction(1,1,3); // 1 1/3
  F2 := Fraction(4,3);   // 4/3
  writeln('F1.ToString = ',F1.ToString); // '4/3'
  writeln('F1.Resolve  = ',F1.Resolve);  // '1 1/3'
  writeln('F1.ToFloat  = ',F1.ToFloat:16:16); // 1.3333333333333333
  writeln('F2.ToString = ',F2.ToString); // '4/3'
  writeln('(F1 = F2)   = ',F1=F2);         //True  F1 := Fraction(1,2);
  F2 := Fraction(1,3);
  writeln(F1.ToString,' * ',F2.ToString,'   = ',(F1*F2).Resolve);  // '1/6'
  writeln(F1.ToString,' / ',F2.ToString,'   = ',(F1/F2).Resolve);  // '1 1/2'
  writeln(F1.ToString,' + ',F2.ToString,'   = ',(F1+F2).Resolve);  // '5/6'
  writeln(F1.ToString,' - ',F2.ToString,'   = ',(F1-F2).Resolve);  // '1/6'
  writeln(F1.ToString,' ** 2    = ',(F1**2).Resolve);  // '1/6'  D := 0.25;
  F1 := FloatToFraction(D, 0.000001);
  writeln('FloatTofraction(0.25) -> ',F1.ToString);   // '1/4'
  writeln;
  writeln('Approximations of Pi:');
  writeln('                                              [Pi = ',Pi:16:16,']');
  Prec := 1.0;
  for i := 1 to 10 do
  begin
    Prec := Prec / 10;
    F2 := FloatTofraction(Pi, Prec);
    writeln('FloatTofraction(Pi,',Prec:10:10,') = ',Format('%-13s',[F2.Resolve]),'   [',F2.ToFloat:16:16,']');
  end;
end.

输出:

F1.ToString = 4/3
F1.Resolve  = 1 1/3
F1.ToFloat  = 1.3333333333333333
F2.ToString = 4/3
(F1 = F2)   = TRUE
1/2 * 1/3   = 1/6
1/2 / 1/3   = 1 1/2
1/2 + 1/3   = 5/6
1/2 - 1/3   = 1/6
1/2 ** 2    = 1/4
FloatTofraction(0.25) -> 1/4Approximations of Pi:
                                              [Pi = 3.1415926535897932]
FloatTofraction(Pi,0.1000000000) = 3 1/7           [3.1428571428571428]
FloatTofraction(Pi,0.0100000000) = 3 1/7           [3.1428571428571428]
FloatTofraction(Pi,0.0010000000) = 3 16/113        [3.1415929203539825]
FloatTofraction(Pi,0.0001000000) = 3 16/113        [3.1415929203539825]
FloatTofraction(Pi,0.0000100000) = 3 16/113        [3.1415929203539825]
FloatTofraction(Pi,0.0000010000) = 3 16/113        [3.1415929203539825]
FloatTofraction(Pi,0.0000001000) = 3 4703/33215    [3.1415926539214212]
FloatTofraction(Pi,0.0000000100) = 3 4703/33215    [3.1415926539214212]
FloatTofraction(Pi,0.0000000010) = 3 4703/33215    [3.1415926539214212]
FloatTofraction(Pi,0.0000000001) = 3 14093/99532   [3.1415926536189365]
F1.Resolve  = 1 1/3
F1.ToFloat  = 1.3333333333333333
F2.ToString = 4/3
(F1 = F2)   = TRUE
1/2 * 1/3   = 1/6
1/2 / 1/3   = 1 1/2
1/2 + 1/3   = 5/6
1/2 - 1/3   = 1/6
1/2 ** 2    = 1/4
FloatTofraction(0.25) -> 1/4Approximations of Pi:
                                              [Pi = 3.1415926535897932]
FloatTofraction(Pi,0.1000000000) = 3 1/7           [3.1428571428571428]
FloatTofraction(Pi,0.0100000000) = 3 1/7           [3.1428571428571428]
FloatTofraction(Pi,0.0010000000) = 3 16/113        [3.1415929203539825]
FloatTofraction(Pi,0.0001000000) = 3 16/113        [3.1415929203539825]
FloatTofraction(Pi,0.0000100000) = 3 16/113        [3.1415929203539825]
FloatTofraction(Pi,0.0000010000) = 3 16/113        [3.1415929203539825]
FloatTofraction(Pi,0.0000001000) = 3 4703/33215    [3.1415926539214212]
FloatTofraction(Pi,0.0000000100) = 3 4703/33215    [3.1415926539214212]
FloatTofraction(Pi,0.0000000010) = 3 4703/33215    [3.1415926539214212]
FloatTofraction(Pi,0.0000000001) = 3 14093/99532   [3.1415926536189365]



 

这篇关于Lazarus分数计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/651066

相关文章

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

Java - BigDecimal 计算分位(百分位)

日常开发中,如果使用数据库来直接查询一组数据的分位数,就比较简单,直接使用对应的函数就可以了,例如:         PERCENT_RANK() OVER(PARTITION BY 分组列名 ORDER BY 目标列名) AS 目标列名_分位数         如果是需要在代码逻辑部分进行分位数的计算,就需要我们自己写一个工具类来支持计算了 import static ja