F#与数学(I) – PowerPack中的数字类型

axure9 资源包 软件设计资源 产品 设计 软件原型图以及动态产品交付成稿 立即下载

在这篇文章中,我们将简单地看看F# PowerPack中可用的两种数字类型。Complex类型代表由实数部分和虚数部分组成的复数。两部分数字都是以浮点型数据存储的。类型BigRational表示由任意大小的分子与分母组成的有理数。任意大小的整数则是由从.NET4.0就可用的BigInterger类来表示的(位于System.Numerics.dll程序集中)。在.NET2.0中,BigIntger类型也是F# PowerPack中的一部分。

本文是介绍F#与F# PowerPack中数字计算功能系列文章中的一篇。此系列中的其他文章讨论了矩阵,自定义数字类型和编写范型代码。其它部分的链接请看F#与熟悉-F# PowerPack概括。

使用复数

第一个例子演示了F# 中的复数可以执行的几个基本操作。为了能够执行下面列出的代码,首先你需要添加引用 FSharp.PowerPack.dll。这个你可以通过在F#的Interactive中使用#r命令(当工作在F# 脚本文件上时,如Script.fsx)或者通过在Visual Studio中创建F# 工程并使用添加引用对话框来完成(或者使用编译器选项-r:FSharp.PowerPack.dll):

 1: #r "FSharp.PowerPack.dll"
 2: open Microsoft.FSharp.Math;;
 3:
 4: let c = complex -1.0 0.0;;
 5: val c : complex = -1r+0i
 6:
 7: let i = sqrt c;;
 8: val i : Complex = 6.12303176911189e-17r+1i
 9:
10: i * i;;
11: val it : Complex = -1r+1.22460635382238e-16i { ... }

引用了PowerPack以及打开包含数学计算功能函数的命名空间后,这个代码片断使用complex函数创建一个复数。第一个参数表示实部,第二个则表示虚部,上面的例子则是创建了一个表示实数-1,虚数为0的一个复数。下一步则是使用函数sqrt来计算平方根。由于这是复数的计算,因此取平方根是一个合法的运算,并且会返回一个数字i(伴随一些四舍五入的错误)。接下来,代码片断计算i的平方,然后又得到实数-1。

注意,在F#库中的sqrt和*都是标准运算并且它们不能用来显示处理复数类型。取而代之的是,它们可以工作在任意提供了特定成员的类型上。这是通过使用静态成员约束来实现的,这些将会在本系列的最后两篇文章中讨论到。(请看介绍)。

使用有理数

在这部分中,我们同样看看一个简单的代码示例,此示例展示了如何使用BigRational类型。通过使用后缀N我们可以更方便的使用此类型的原型.只有当FSharp.PowerPack.dll库被引用后,此后缀才可以使用,并且可以用它写成代表整数的(任意大小的)有理数。要想取得代表分数的有理数,我们可以使用除法来获得:

 1: let r1 = 4N / 6N;;
 2: val r : BigRational = 2/3N
 3:
 4: let r2 = pown r1 10;;
 5: val r : BigRational = 1024/59049N
 6:
 7: let q1 = pown (1N / 2N) 5
 8: let q2 = pown (1N / 2N) 6;;
 9: val q1 : BigRational = 1/32N
10: val q2 : BigRational = 1/64N
11:
12: q2 < r2 && q1 > r2;;
13: val it : bool = true

在这里,只能用整数来创建如4N这样的数字原型。然而,类型BigRational中已经重载过的除法操作符则可以返回一个代表分数的BigRational类型数据。和你所见到的一样,这样的数字均是以标准化的格式存储起来的(这就意味着此分数是一个最简分数)。

下面的几行代码用来寻找一个数q,使得(1/2)q介于r2和(1/2)(q+1)之间。和复数情况一样,我们也可以使用如pown与<这些标准的函数与操作符。这些都已经被重载,因此对任何数字类型都有效。

我们可以使用如4N的形式来声明一个BigRational类型的原型。而这并不是系统内置的语言功能。事实上,你可以为你自己的数字类型自定义它的原型表示方法(使用一些受限制的后缀)。这些会在一篇解释如何自定义一个数字类型的文章中讨论到(请看介绍的链接)。

用F#计算PI

来看几个使用了BigRational类型的大一点的例子,让我们写一个用来估算π的F#代码片断。这个例子用了Gregory-Leibniz系列,WikiPedia上给出了此系列的解释。这个系列的前几个数字是4/1 - 4/3 + 4/5 - 4/7等。很容易就可以发现其中的规律——分母每次都加2并且操作符在+和-上交替变化。这些系列数字计算起来很简单,但是它并不能给出一个精确的评估。但是它已经能够很好的演示实数类型数据的使用方法。

我们可以通过把这个序列作为seq<BigRational>类型的值来很好的让代码以函数式的形式表现出来。下面的函数series先计算序列中的一个元素(使用分母n)然后递归的调用它自己来计算剩下的元素:

 1: /// Generates series that approximates PI
 2: /// 4/1 - 4/3 + 4/5 - 4/7 + 4/9 (starting from q * 4/n)
 3: let rec series n q =
 4:   seq {
 5:     yield q * 4N / n
 6:     yield! series (n + 2N) (q * -1N) }
 7:
 8: let pi1 = series 1N 1N |> Seq.take 10 |> Seq.reduce (+)
 9: val pi1 : BigRational = 44257352/14549535N
10: float pi1
11: val it : float = 3.041839619
12:
13: let pi2 = series 1N 1N |> Seq.take 300 |> Seq.reduce (+)
14: val pi2 : BigRational = (...)
15: float pi2
16: val it : float = 3.13825933

如果我们将此序列中所有元素都相加,我们将得到精确地π。不幸的是,我们没有无穷的空间与时间来完成这个,因此这个代码片断仅计算了前面的几个元素(使用Seq.take)然后使用Seq.reduce将这些元素相加。第偶数个的元素都是负数,由于series函数将每个元素都乘以q,而q则是1和-1中的一个,因此,我们使用+操作符来作为累计函数。

在C#中使用F#的数字类型

PowerPack库主要是为F#而设计的,为之添加了一些功能。与此同时,它也是一个标准的.NET库,因此它也可以被C#引用。且F#采用同C#一样的方式来表示这些重载过的操作符,因此类型BigRational和Complex能被C#十分方便的使用(当使用.NET2.0时,BigInteger也如此)。

下面的例子重新实现了之前用来计算π的F#代码片断。它采取了与F#一样的处理方式。方法Series用来产生Gregory-Leibniz序列的元素。实现中使用了循环来代替之前的递归,由于在C#中不能方便有效的书写递归迭代:

1: static IEnumerable<BigRational> Series() {
2:   var n = BigRational.FromInt(1);
3:   var q = BigRational.FromInt(1);
4:   while (true) {
5:     yield return q * BigRational.FromInt(4) / n;
6:     n = n + BigRational.FromInt(2);
7:     q = q * BigRational.FromInt(-1);
8:   }
9: }

可以看到,我们可以使用静态方法BigRational.FromInt创建整型的BigRational数据。此类型同样实现了标准的重载操作符(代码使用了+,*和/)以及一些额外的操作符如BigRational.PowN(用来计算N次方)。为了取得一个浮点型的数来表示π的合适值,我们可以这样写代码:

1: var pi = Series().Take(300).Aggregate((a, b) => a + b);
2: Console.WriteLine(BigRational.ToDouble(pi));

在C#中,我们可以使用LINQ来计算序列中的300个值然后相加。所得到的有理数可以通过使用BigRational.ToDouble来将之转为浮点型数据。

总结

在C#中使用F#PowerPack仅仅是个惊喜。这个库主要是为F#设计的,但是它遵循了.NET的程序标准模式,因此它也能够被C#完美地使用。在F#PowerPack中实现了的有理数对许多程序来说的有很有用的,但是,如果你需要更多的特性或者更好的效率,那么你可以阅读一下MSDN上的一系列.NET(以及F#)的数字类库。

引用与链接

  • Pi - 估算π的值- WikiPedia

PowerPack.dll F# PowerPack.dll F#进行数学编程需要的DLL 立即下载

相关推荐

BigRationals:任意大小的有理类型

BigRationals:任意大小的有理类型

F#与数学 - 数字运算与F# PowerPack

这篇文章是此系列中的第一篇,在这个系列中,我将介绍F#中的一些特性,如对数字运算有帮助的特性以及一些来自F# PowerPack库的一些功能。大部分内容最初都是为位于MSDN上名为“F#中的数字运算”的章节(我之前发布的)所写的,但是后来,我们决定把重点放到使用第三方语言库的F#编程上,这些库提供了更多有效的实现以及更丰富的标准数字运算函数集合,通常在实现机器智能学习和概率算法或者进行统计分析时,

fsharp_net的专栏 1102

雷电模拟器9.0最新过检测实战:从修改Build.prop到Xposed模块配置全流程

本文提供了一套针对雷电模拟器9.0的深度伪装实战方案,旨在绕过应用检测。内容涵盖从理解检测机制、获取Root权限、修改Build.prop等静态伪装,到利用Xposed/LSPosed框架进行运行时Hook的动态伪装全流程,帮助用户构建无痕的“真机”环境以稳定运行应用。

z4a5b6的博客 864

The first error on F#

Copy the first demo program from Expert F# to VS2008. There has a compiler error with split function when I compiler the program. I found a solution from internet likes below: CodeListing2-1.A...

diansu5840的博客 104

Qt QWebEngine实战:手把手教你将Vue3/React前端项目嵌入C++桌面程序

本文详细介绍了如何利用Qt的QWebEngine模块将Vue3/React前端项目无缝嵌入C++桌面程序,实现现代前端框架与原生C++的深度整合。通过环境准备、项目架构设计、前端适配、Qt端集成、双向通信建立及性能优化等步骤,开发者可以高效构建兼具Web灵活性和本地系统能力的混合应用。

weixin_28736355的博客 390

GCdepth散点图绘制

基因组组装完成后,需要对组装结果进行评估,其中GC_depth图是一个比较重要的指标,改图的横坐标是GC含量,纵坐标是平均深度。以30k为窗口(window)无overlap计算其GC含量和平均深度。如果存在样品污染,通常能够从GC含量分析中呈现出来。下文探索了几种绘制GC_depth散点图的方法思路。

huangliangbo的专栏 8993

F#语言的学习路线

函数式编程是将计算视为数学中函数的求值的编程范式。它强调使用不可变数据结构和高阶函数。学习F#的第一步是理解函数式编程的基本概念,包括函数的定义、应用和组合。在F#中,函数通过let关键词定义。你可以定义简单的函数,也可以定义带有参数的函数。fsharpF#是一种强大的函数式编程语言,适用于广泛的应用场景。通过本文的学习路线,从基础知识到深入应用,以及实践项目,你将能够熟练掌握F#并应用于实际工作中。随着对函数式编程思维的深入理解,你将发现F#在提高代码可读性和可维护性方面的独特优势。

2501_91409158的博客 486

深度学习驱动材料科学:晶体生成与性质预测技术综述

深度学习作为人工智能的核心技术,通过模拟人脑神经网络处理复杂数据,在多个领域展现出强大的模式识别与生成能力。其原理在于构建多层非线性变换,从海量数据中自动学习特征表示与映射关系。这一技术价值在于能够高效处理高维、非结构化数据,解决传统方法计算成本高、探索空间有限的问题。在工程实践中,深度学习已广泛应用于计算机视觉、自然语言处理等领域,并正深刻变革材料科学的研究范式。具体到材料领域,它通过学习已知材料的构效关系,实现对新材料性能的快速预测与逆向设计。应用场景包括但不限于新能源材料、半导体、催化剂等领域的高通量

weixin_28695161的博客 414

F#语言的算法

F#语言是一种以函数为中心的编程语言,鼓励使用不可变数据结构和高阶函数。与其他语言相比,F#在函数式编程的特性上更为突出,这使得开发者可以更容易地实现复杂的算法。静态类型系统:F#的静态类型系统可以在编译时捕捉错误,提供更强的类型安全性。这对于算法实施至关重要,因为许多算法对输入数据类型有严格的要求。强大的表达力:F#的表达式可以非常简洁,有利于实现复杂的算法逻辑。函数式编程的特性使得代码可以更容易地复用和组合。不可变性:F#提倡使用不可变的数据结构,这样可以减少副作用,提高代码的可预测性。

2501_90359402的博客 373

【STM32篇】DRV8425驱动步进电机

【STM32篇】在上篇文章中使用了HR4988实现了步进电机的驱动,在实际运用过程,4988驱动步进电机会存在电机噪音太大的现象。本次将向各位友友介绍一个驱动简单且非常静音的一款步进电机驱动IC。

we_long的博客 3068

告别Quartus II的漫长等待:用VSCode+iverilog+GTKWave搭建你的轻量级Verilog仿真环境(2024保姆级教程)

本文详细介绍了如何利用VSCode、iverilog和GTKWave构建高效的Verilog/SystemVerilog开发环境,替代传统的Quartus II和ModelSim工具。通过2024年最新的保姆级教程,帮助开发者实现秒级启动、低资源消耗的轻量级仿真环境,显著提升数字电路设计的开发效率和调试体验。

weixin_33690963的博客 561

F#与数学(III) – 自定义数字类型(PartIII)

用全局关联来支持矩阵 我们的数字类型可以被用在一些标准的库函数如List.sum中,因为它们实现一些被List.sum必需的静态成员约束的成员。然而,这种方法对复杂的数据类型如泛型矩阵不工作。如果我们试图用我们的类型写任意矩阵计算,这将是不工作的,因为泛型矩阵类型不能自动的使用我们提供的重载操作符和成员。 为了支持矩阵我们需要提供所谓的数值关联。它是个简单的接口,包含了我们的类型上能被执行的数

fsharp_net的专栏 1583

CUDA:实现使用cuSolverSP底层API实现Cholesky因式分解(附完整源码)

CUDA:实现使用cuSolverSP底层API实现Cholesky因式分解(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 346

第七章 F# 库(一)

第七章 F# 库(一)   虽然 F# 可以使用 .NET BCL 中的所有类,但它自己也提供了一组库。 [ 现代汉语中使用单字名词的已经很少了,因此,libraries 有时译成库,有时译成库函数。严格来讲译成库函数是不准确的,因为,库中肯定不止包含函数。 ] F# 库分成两部分,一个是 FSharp.Core.dll,也称为 F# 核心库(F# core library)或本

心想事成 1320

滑模观测器与锁相环结合应用:让电机“无感”也能精准旋转的奥秘

本文介绍了永磁同步电机无传感器控制中的滑模观测器(SMO)结合锁相环(PLL)技术。SMO通过创建虚拟电机模型,利用电流误差产生控制信号来估计反电动势;PLL则从反电动势中解码转子位置和速度信息。该组合方案兼具SMO的鲁棒性和PLL的高精度,计算量小且硬件要求低。文章详细阐述了原理、数学模型、参数整定方法及实际实现技巧,包括离散化处理、符号函数替代等优化手段,并分析了低速性能限制、抖振问题等常见挑战及解决方案。最后指出该技术未来将与人工智能、多观测器融合等方向结合发展。

汽车软件开发 195

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

第七章 F# 库(五)

第七章 F# 库(五) 事件(Microsoft.FSharp.Control.Event)模块   可以把 F# 中的事件看做是函数的集合,能够通过函数调用来触发。其思想是,函数本身注册成事件,即函数的集合,等待事件发生的通知;然后,触发函数发出事件已经发生的通知,引发所有添加到事件中的函数被执行。 我们将讨论事件模块中的下列功能: 创建和处理事件:使用 create

心想事成 2200

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Visual Basic .NET Power Pack 简介

发布日期: 9/1/2004 | 更新日期: 9/1/2004Robert GreenMicrosoft Corporation适用范围:Microsoft Visual Basic .NET 版本 2003摘要:本文介绍了 Visual Basic Power Pack,它由一组自定义控件组成,为基于客户端的应用程序提供了增强的用户界面元素。 本页内容

雨雪之家 2587

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

c#ovalshape_将具有powerpack ovalshape的visual studio 2010项目迁移至visual studio 2015

HiI am facing errors when I run the project on vs 2015 which has been made in vs 2010. when I debug the code in vs 2015 it showing me some errors as the following:Error BC30002Type 'Microsoft.Vis...

weixin_39933484的博客 271

F#与数学(III) – 自定义数字类型(PartII)

交互地测试数字类型 下一步,我们将用F#交互来验证我们所写的代码到目前为止是按预期工作的。在这一点上,我们甚至没有生成库。我们仅仅写了一些F#的源代码,想不生成库来测试这些源代码。我们将使用在F#脚本文件中写入的交互式测试。一旦你建立了库,就可以很容易地用NUnit,XUnit或者其他测试框架把它们转变成相应的单元测试。 为了测试我们在源代码级别实现的类型,我们先添加一个新的名为Test.fs

fsharp_net的专栏 1878

F# 图形数学基础。

这几天,在看Unity3D,很有意思,其中看到,第一人称控制器,就想看到里面的一些控制脚本是如何实现,才发现,学到的好多数据知识已经还给老师了,还好,走遍大江南北,跟着的书不多,唯一的二本高数没丢. 然后参考网上各个简洁明了的讲洁. 主要有http://my.csdn.net/cppyin 的从零实现3D图像引擎. 用此文只是用来记录一些向量,矩阵等的操作.没别的实际意义.会与我的学习来更新...

weixin_34390996的博客 280

vs2013缺少Microsoft.VisualBasic.PowerPacks程序集

网上百度很多大多不能用。自己到正规网站的支持网站上下载VS2013官方更新的Microsoft.VisualBasic.PowerPacks扩展程序集 http://ntcoder.com/bab/2013/12/20/visualbasic-powerpack-missing-from-visual-studio-2013/ 祝好

LazyMickey的博客 3340

F# 入门(三):F# 基础数据类型

类型检查可发生在编译时期(静态检查)或运行时期(动态检查)。静态类型检查是在编译器进行语义分析中进行的。如果一个语言强制实行类型规则(即通常只允许以不丢失信息为前提的自动类型转换)就称此语言为强类型,反之称为弱类型。F#使用的是静态类型检查。这意味着,如果你传入一个string 值给 类型为int的变量,那么你将得到一个编译错误。 下面是F# 中一些数据类型: 你可以通过let关键字来定义值,

fsharp_net的专栏 1990

C#Winform提示错误,Release模式下报错Visual Basic Powerpack不存在 ,是否缺少引用

首先,在自己的工具箱的选项卡里面看一下你的Microsoft.VisualBasic.PowerPacks版本,如果是10.0,使用如下官网链接更新安装 http://go.microsoft.com/fwlink/?LinkId=321343 安装完成以后将上面的组件添加到工具箱的选项卡里面。如下所示使用power过滤检索,快速引用: 下一步将reference引用添加到程序中,如果不记得路径可以在上一步的视图里面查看路径: 如下所示:这样就完成了 程序build通过,但..

Steven_eleven的博客 1387

第6章第4节:自定义分词器

本节详解Elasticsearch自定义分词器,解析analyzer三段式结构(char_filter→tokenizer→filter),掌握常用组件如ik_max_word、synonym_graph、ngram等。通过_analyze API调试分词效果,实现“索引时扩展同义词、搜索时不带”的生产级方案,提升中文搜索与智能提示体验。

啊渊的专栏 314
上一篇: F# 入门(十一):链表与数组
下一篇: F# 入门(十二):Tuple(元组)
fsharp_net
博客等级 码龄15年 20粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值