Swift Numerics开源库:让Swift更适合数值计算

2019 年 12 月 18 日

Swift Numerics开源库:让Swift更适合数值计算

苹果的工程师 Steve Cannon 说,Swift Numerics是一个新的 Swift 开源库,它试图填补 Swift 标准库(Standard Library)的空白。目前,它包含两个模块,分别用于实数和复杂的数学计算,但是在它的路线图上有更多的内容


按照目前的决策,Swift Numerics 依然保持在其自身的包中,而不是位于标准库中,这主要是因为编译器的一些限制,这些限制阻碍了新 API 的实现,因为实现的方式必须要满足 Swift 对跨语言版本源代码稳定性的承诺。尽管如此,并不排除 Swift Numerics 将来可能会转移到标准库的可能性。无需多言,只有那些足够通用的特性才能考虑加入到标准库之中。


Swift Numerics 是一个模块化的库,这意味着我们可以只导入所需的模块。例如,如下展现了如何只导入Complex模块:


import Complex
复制代码


另外,我们还可以按照这些写法导入整个 Numerics API:


import Numerics
复制代码


Real模块定义了三个协议:ElementaryFunctionsRealFunctionsReal,Cannon 说,最后一个是其中最重要的。


Real描述了一个浮点类型,它提供了完整的数字函数集,比如explogcospow等等。其强大之处在于,借助它,我们可以编写通用的代码,这些代码能够无缝地集成到 Swift 未来会添加的新浮点类型中,比如Float16Float128。上文提到的另外两个协议用于分区(partition)函数,它们可以很容易地扩展至比实数更通用的数字字段,或者扩展至非实数字段。后者包括像exp2exp10gammalogGamma等众多的函数。


Complex数字构建在Real之上:


public struct Complex<RealType> where RealType: Real {  ...}
复制代码


借助简单直接的语法,我们可以针对复杂数字进行基本的计算操作:


import Complex// 声明一个复杂数字:let z: Complex<Double> = 2 + 3 * .iprint(z)           // (2.0, 3.0)print(z.real)      // 2.0print(z.imaginary) // 3.0let w = Complex<Double>(1, -2.5)let zz = z + zzlet p = z * Complex(0, 2.5)
复制代码


据 Cannon 所言,与 C 代码相比,Swift Numerics 提供了更好的性能。这主要是由于对 0 和 NaN 的处理进行了简化。虽然 C(和 c++)倾向于区分不同类型的 0 和 NaNs,但是 Swift Numerics 倾向于丢失一些信息来简化代码,这减少了程序员保持安全性和正确性的开销,并带来了显著的速度优化。


最后值得一提的是,Swift Numerics 依然处于活跃的开发之中,未来会加入更多的类型,包括 Float16(https://github.com/apple/swift-numerics/issues/8)、超过 64 位的固定宽度的整数、表示多维同构数据的ShapedArray 协议等。


原文链接


Swift Numerics Aims to Make Swift Suitable for Numerical Computing


2019 年 12 月 18 日 09:001849

评论

发布
暂无评论
发现更多内容

java安全编码指南之:表达式规则

程序那些事

java安全编码 java安全 安全编码规则

去中心化交易所搭建,虚拟币去中心化交易系统

13823153121

交易所开发

协同新机遇:让研发敏捷起来

人称T客

未读消息(小红点),前端与 RabbitMQ实时消息推送实践,贼简单~

程序员内点事

Java RabbitMQ mqtt

oeasy 教您玩转 linux 010207 黑客帝国 matrix

o

Docker 容器编排利器 Docker Compose

哈喽沃德先生

Docker 容器 微服务 Docker-compose 容器化

新基建夯实粤港澳大湾区高质量发展基础

CECBC区块链专委会

区块链 人工智能 大数据

媒体电视台跟进,船长梁晓玲平台拉人头卖课引起多方报道!

成周

The Go Blog-Article index

卓丁

教师节特别活动:第四范式多项自研技术及其应用实践分享

天枢数智运营

人工智能 推荐系统 第四范式 个性化推荐

使用开源软件构建工业互联网的平台

刘旭东

工业互联网 Odoo thingsboard

Redis 哨兵模式

是老郭啊

redis redis哨兵模式 redis哨兵 redis哨兵集群

合约跟单app,永续合约交易所带单交易软件

13823153121

通证与通证经济你真的理解吗

CECBC区块链专委会

区块链 通证经济

为什么我的缓存设置在chrome中不生效

书虫

chrome 缓存 浏览器 HTTP

深度解析!--阿里开源分布式事务框架Seata

攀岩飞鱼

分布式 分布式事务 微服务 分布式锁 Seate

云图说 | GPU共享型AI容器,让AI开发更普及

华为云开发者社区

AI 容器

【万字长文】探讨可信构架之道

华为云开发者社区

架构 服务端

模板方法模式——看看 JDK 和 Spring 是如何优雅复用代码的

Java架构师迁哥

LeetCode题解:225. 用队列实现栈,两个队列,压入 -O(1), 弹出 -O(n),JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

第4周总结

Vincent

极客时间 极客大学

MySQL高性能架构设计原则

李浩宇/Alex

物联网通信技术最全科普!你一定要了解的NB-IoT

华为云开发者社区

物联网

当心这些“坑”!阿里云服务器部署前后端分离项目

麦叔

nginx 前后端分离 跨域

干货!如何平稳用户无感知的完成系统重构升级

X先生

架构 运维 后台

CSS常用样式——绘制单(双)箭头的多种方法(2)

程序员学院

CSS html 程序员

数据质量管理工具的意义和定位

苏槐

数据治理 数据质量管理 数据质量平台

解Bug之路-串包Bug

无毁的湖光

redis socket Java 分布式

第4周作业

Vincent

极客时间 极客大学

传统产业数字化转型的思考与建议

CECBC区块链专委会

经济转型 企业经济

大厂运维必备技能:PB级数据仓库性能调优

华为云开发者社区

架构 数据

Swift Numerics开源库:让Swift更适合数值计算-InfoQ