D语言中的浮点运算

浮点运算与汇编语言编程详解 本博客围绕浮点数的二进制与十进制转换、IEEE浮点表示、双精度浮点数结构、NaN类型、FPU指令集(如FSTP、FST、FADD、FISUB、FSUB)等内容展开,详细讲解了浮点运算的基本原理与实际应用。此外,博客还涵盖汇编语言中的浮点比较、条件输出、寄存器使用、C与汇编混合编程、优化技巧以及质数判断程序的实现,适合对底层编程与浮点运算机制感兴趣的开发者学习。 阅读详情
 

浮点

浮点运算中间值

在许多计算机上,使用较高精度的运算并不比使用较低精度的运算耗费的时间长,所以为内部的临时变量采用机器允许的最高精度对于数值运算是有意义的。这里采用的哲学是不强求语言为统一而采用各种硬件的最低精度,从而充分利用目标硬件的最佳性能。

对于浮点运算表达式的中间值来说,可能会使用高于表达式类型所要求的精度。操作数的类型只决定最低精度而不是最高精度。实现注记:例如,在 Intel x86 机器上,计算的中间步骤最好(但不是必需)使用硬件提供的全部 80 位精度。

如果临时变量和公共子表达式的使用量很大的话,优化后的代码很可能会得到比未优化代码更精确的解。

算法应该以计算的最小精度为基础。如果实际的精度更高,它们也不应该退化或者失败。同扩展类型不同,float 或者 double 类型应该用于:

  • 减少大型数组的内存消耗
  • 维持同 C 的数据和函数参数的兼容性

负数和虚数类型

在现有的语言中,为了将复数类型添加到现存类型体系中可谓费尽周折:模板、结构、运算符重载等等,并且最终的结果几乎都是失败。失败的原因可能是由于复数运算的语义很微妙,是由于编译器不理解程序员想要做什么,因而无法对语义的实现进行优化。

所有这些的目的都只是为了避免加入一个新类型。添加一个新类型意味着编译器可以使所有的复数语义工作“正常”。然后程序员就可以依靠复数的正确(至少是稳定)的实现。

伴随而来的是对虚数的需求。虚数类型是我们可以避开一些微妙的语义问题,并且由于不用处理隐含的 0 实部,可以提高运算的性能。

虚数文字量有一个 i 作为后缀:

	ireal j = 1.3i;
	
复数文字量没有自身特殊的语法,只需写成实数类型和虚数类型相加即可:
	cdouble cd = 3.6 + 4i;
	creal c = 4.5 + 2i;
	
复数有两个属性:
	.re	实数部分
	.im	虚数部分
	
例如:
	cd.re		是 4.5 double
	cd.im		是 2 double
	c.re		是 4.5 real
	c.im		是 2 real
	

取整控制

IEEE 754 浮点数算术包括了设置四种不同的取整模式的能力。D 加入了支持它们的语法:[blah, blah, blah] [注记:也许使用标准库更好]

异常标志

IEEE 754 浮点数算术可以为计算中发生的事件设立标志:[blah, blah, blah] 这些标志可以使用如下如法设置/重置:[blah, blah, blah] [注记:也许使用标准库更好]

浮点比较

除了常用的 <、<=、>、>=、== 和 != 比较运算符外,D 另外提供了专用于浮点数的运算符。它们是 !<>=、<>、<>=、!<=、!<、!>=、!> 和 !<>,并符合 C 扩展 NCEG 的语义。
	浮点数比较运算符	运算符关系	无效? 	描述

			> < = ? 

	<		F T F F		yes 	小于
	>		T F F F		yes 	大于
	<=		F T T F		yes	小于或等于
	>=		T F T F		yes	大于或等于
	==		F F T F		no	等于
	!=		T T F T		no	未定义、小于或大于
	!<>=		F F F T		no	未定义
	<>		T T F F		yes	小于或大于
	<>=		T T T F		yes	小于、等于或大于
	!<=		T F F T		no	未定义或大于
	!<		T F T T		no	未定义、大于或等于
	!>=		F T F T		no	未定义或小于
	!>		F T T T		no	未定义、小于或等于
	!<>		F F T T		no	未定义或等于
	
D语言中的内联汇编在x86平台上的实现 D x86 内联汇编D,作为一种系统程序设计语言,提供了内联汇编的功能。对于同一个处理器家族来说,D 的内联汇编的实现是标准化了的,例如,Intel Pentium 上的 Win32 D 编译器的内联汇编的语法同 Intel Pentium 上的 Linux D 编译器的语法是一样的。 但是,不同的 D 实现,可以依内存模型、函数调用/返回约定,参数传递约定等的不同而自由实现内联汇编。 本文描述了 阅读详情

相关推荐

14、深入理解C语言中的浮点运算与可变参数列表

本文深入探讨了C语言中的浮点运算与可变参数列表,详细分析了浮点数的表示、运算误差及比较方法,并介绍了可变参数列表的实现与高级应用。同时提供了优化技巧和安全性建议,帮助开发者更好地掌握这些高级特性,编写高效可靠的程序。

open4的博客 138

IEEE 754 浮点数的四种舍入方式

四种舍入方向: 向最接近的可表示的值;当有两个最接近的可表示的值时首选“偶数”值;向负无穷大(向下);向正无穷大(向上)以及向0(截断)。 说明:默认模式是最近舍入(Round to Nearest),它与四舍五入只有一点不同,对.5的舍入上,采用取偶数的方式。举例比较如下: 例2: 最近舍入模式:Round(0.5) = 0; Round(1.5) = 2; Round(2...

weixin_30426065的博客 1680

16、RISC-V 汇编语言中的浮点运算编程指南

本博客详细介绍了RISC-V汇编语言中的浮点运算编程指南,包括GNU调用约定、浮点寄存器的使用、fcsr状态寄存器的操作、舍入模式和异常标志的控制,以及浮点计算、转换和比较等基本操作。并通过一个华氏温度到摄氏温度转换的实例,展示了如何在实际编程中应用这些知识,实现精确的浮点运算并进行异常处理。

tt34567的博客 155

D语言排名持续升上升

2014年1月,D语言在TIOBE编程语言排名持续升高,位列18名。 D语言是由Digital Mars公司的Walter Bright所开发的面向对象、指令式、多范型系统程式设计语言。D语言起源自C++,并受到C++很大的影响,不过D语言并不是C++的变种。D语言对C++的部分特性重新设计,并受到其它编程语言观念的影响,如Java、C#以及Eiffel。2007年1月2日释出1...

alantop's blog 250

16、RISC-V 汇编语言中的浮点运算综合指南

本文详细介绍了RISC-V汇编语言中的浮点运算,涵盖浮点寄存器的使用、控制状态寄存器(fcsr)的配置、舍入模式、数据格式以及异常处理等内容。文章通过具体的温度转换示例,展示了如何在RISC-V中实现浮点计算,并讨论了性能优化和常见问题的解决方案,旨在帮助开发者掌握RISC-V浮点运算的核心概念和实际应用。

pz8901234的博客 115

15、RISC-V 汇编语言编程与浮点运算

本文深入探讨了RISC-V汇编语言编程中的多个关键主题,包括字符串处理函数如strncpy32()、struint()和uintstr()的实现与测试,展示了其在嵌入式环境中的应用;通过cgoto()函数介绍了索引分支的高效使用;同时讨论了浮点运算的必要性及其在RISC-V架构中的实现方式。文章还涵盖了硬件与软件浮点运算的区别、浮点寄存器的使用以及浮点加法和乘法的伪代码示例,最后对RISC-V在嵌入式系统中的未来发展进行了展望。

pz8901234的博客 78

printf以%d形式输出浮点数的问题

float value = 1.0; printf("value_int = %d\n", value);   对于上面的代码,会输出什么结果呢?(结果是0,当然这跟你的计算机是大端还是小端有关,大小端分析一样,这里是以小端为例)是不是觉得很奇怪,value的浮点数表示形式是0x3F800000,如果以整形输出,应该也是这个值的十进制表示才对的。 单精度浮点数表示是:1位符

7479

Verilog实现高效浮点运算单元设计

浮点运算单元(FPU)是计算机处理器中专门负责执行浮点运算的硬件模块。它允许处理器处理高精度的数学运算,包括实数的加、减、乘、除以及更复杂的数学函数计算。在科学计算、工程模拟、金融分析和许多其他需要高精度计算的应用中,FPU扮演着至关重要的角色。Verilog语言是一种硬件描述语言(HDL),广泛应用于数字电路的建模、仿真、测试和综合。它允许设计师以文本形式描述硬件电路的结构和行为,并且可以通过仿真软件进行验证。Verilog的设计语法包括模块、端口、数据流、行为级和任务与函数等几个主要部分。

weixin_36444661的博客 1225

星际跃迁的距离

输入四个浮点数,代表两个点的坐标 (x1​,y1​) 和 (x2​,y2​),计算并输出它们之间的距离。你的导航计算机给出了当前位置的二维空间坐标 (x1​,y1​) 和目标位置的坐标 (x2​,y2​)。数据范围保证为 −1000.0≤x1​,y1​,x2​,y2​≤1000.0。现在,为了规划下一步的探险,你需要在星际地图上计算两个星系之间的直线距离。输入共一行,包含四个实数 x1​,y1​,x2​,y2​,由空格隔开。输出共一行,只包含一个实数,即两点之间的距离。当我们要进行数学运算时;

2502_93340034的博客 333

EnlightenGAN训练复现记录

记录EnlightenGAN过程中的问题和解决方式。提示:以下是本篇文章正文内容,下面案例可供参考。

L_27N113E的博客 3847

STM32CubeMX最新版下载安装全攻略(附官网访问问题解决方案)

本文提供了STM32CubeMX最新版的详细下载与安装指南,并针对国内开发者常见的官网访问缓慢、注册验证邮件延迟等问题,给出了实用的解决方案和备选策略。通过清晰的步骤解析,帮助用户快速部署这一强大的STM32图形化配置工具,从而高效启动嵌入式开发项目。

weixin_28256233的博客 196

arm芯片中的浮点运算(二)

ABI即“application binary interface”,即编译器将c代码编译成汇编代码时使用的一种规则 使用规范如下: 在编译带有浮点参数的函数时,有三种可能的编译选项:  -mfloat-abi=soft  -mfloat-abi=softfp  -mfloat-abi=hard "soft"选项:表明不使用FPU硬件,而是使用GCC的整数算术运算来模拟浮点运算。 "

yuanlu837的专栏 1万+

TexGen模型导出ABAQUS inp文件时纱线材料属性缺失?5分钟快速修复指南

本文针对TexGen模型导出ABAQUS inp文件时纱线材料属性缺失的问题,提供了快速修复指南。通过手动编辑inp文件或使用Python脚本自动补全材料属性,帮助复合材料仿真工程师高效解决问题。文章还介绍了TexGen导出前的预防性设置和ABAQUS中的验证技巧,确保仿真分析的准确性。

qsc901234的博客 250

语言大模型的浮点运算分配

本文通过实证分析展示了实际LLM模型的FLOPS分配情况,并与理论分析进行对比。通过理论和实证相结合的方式,本文为理解和优化语言大模型的性能提供了有益见解。作者Finbarr Timbers是一名机器学习研究员,曾就职于DeepMind。(以下内容由OneFlow编译发布,转载请联系授权。原文:https://www.artfintel.com/p/where-do-llms-spend-thei...

OneFlow深度学习框架 3906

如何在 Ubuntu 24.04 或 22.04 上安装和使用 GDebi

本文介绍了在Ubuntu 24.04上安装和使用GDebi的方法。GDebi是DPKG的轻量级替代品,能够自动解析并安装.deb包的依赖项。文章详细说明了系统更新、安装GDebi的步骤,并演示了通过GUI和CLI两种方式安装.deb包的操作流程。此外,还提供了验证安装和卸载包的方法。GDebi虽然非必需,但为用户提供了处理依赖项的另一种选择,适合需要安装本地Debian包的用户。

山岚的运维笔记 1989

AVM环视:系统搭建整体流程

文章目录前言一、畸变矫正鱼眼相机二、透视变换三、图像拼接四、图像融合总结 前言 由于正在做AVM环视,所以记录一下整个过程,归纳为一个系列文章,并对期间遇到的错误进行归纳整理。本文主要概括了AVM环视的大致流程和逻辑,不涉及代码部分,仅供思路参考,其中涉及的具体技术会在后期整理为小章节进行分析。 一、畸变矫正 鱼眼相机 做环视基本上使用到的是鱼眼照片,因为鱼眼相机的视角范围可以达到220°到230°,所以一个相机就可以采集到一个面的全部信息,例如汽车具有四个面,那么在汽车的前后左右分别安装一个鱼眼相机.

qq_34468890的博客 6536

用Kotlin固定浮点运算

这周我终于看到我花时间与Sonar一起分析我们的代码库。 特别是让我意识到了很多有关浮点运算的问题。 有趣的Java浮点运算法则 那些在学术背景下学习过Java的人可能还记得关于FP算术的一些东西。 然后,如果您从未使用过它们,您可能会忘记它们。 这是一个有趣的非常简单的示例,事实证明是: double a = 5.8d ; double b = 5.6d ; double su...

dlz00001的博客 638

Redis 可视化工具 RedisInsight 的保姆级安装以及使用(最新)

Redis 可视化工具 RedisInsight 的保姆级安装以及使用(最新)

一名全栈小白的博客 1万+

浮点运算简介

                                              作者:Hume/冷雨飘心 对于习惯于C的灵活多变的数据类型和方便的计算那些人而言,了解底层的浮点运算似乎没有什么意义,现在Visual盛行的时代还有多少人关心那些所谓的底层呢? 对了AfOs来说,浮点运算是编程中很重要的一部分,因为我们可能会面临一些稍微复杂的运算,如果你和我一样是Die-hard的as

狗狗的专栏 1304

智能车实战——极速越野组GPS与惯导融合定位导航全解析

本文深入解析了智能车极速越野组中GPS与惯导模块的融合定位导航技术。通过对比GPS的全局定位与惯导的高频姿态感知,详细阐述了如何利用MM32SPN27主控,将两者数据融合以实现精准、实时的车辆控制。内容涵盖硬件选型、软件数据处理、PID控制及系统调试等实战环节,为智能车开发者提供了一套完整的解决方案。

pz8901234的博客 1204

HRNet 【demo 复现过程】

Deep High-Resolution Representation Learning for Human Pose Estimation

qq_45257495的博客 5558

在linux内核中使用整数运算模拟浮点运算计算三角函数

作者声明: 本文系作者独创作品,作者保留所有相关权利。本文首次发表于百度空间——猎人的家园,欢迎网友引用及批评指正。如需转载,请注明出处,并连同本声明一并转载。禁止将本文全部或部分内容用于商业目的,特别鄙视某些源码下载站利用他人作品牟利的行为。 最近在搞一个设备在linux下的驱动,在驱动中需要进行浮点运算和正弦sin、余弦cos和反余弦acos的运算,用来进行设备输出数据和系统消息数据的

zhoujk0520的专栏 3938

温度PID控制PLC程序

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

c语言 float 定点小数,浮点运算,浮点数与定点数(一)

我们评测CPU性能的时候,经常会说道一个概念:浮点运算,我经常在想,浮点运算到底是一个什么样的东西,用得着把它当成评测CPU性能的关键点吗?搞清楚这个问题,首先要说到浮点数和定点数,先看一个例子,用javascript执行console.log(0.1+0.2), 查看其输出,发现0.1+0.2≠0.3!,为什么会这样?这简直太反常识了!计算机中数字的表示我们知道,计算机中通过内存存储数据,一个字...

weixin_29816689的博客 1369

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

D语言游戏编程(1):工作环境

前言作为一个游戏程序员,D语言对我是很有吸引力的!我相信有不少的人和我有同感。我热爱编程,但是我不能说我热爱C++。坦白的讲,如果是我一个人独立编程,我很乐意使用C++,它的好处就不必多说了,但是在一个稍微大一点的团队中,我一直希望找到一种 “更高级”的语言。这些年一直被C++折磨着,即便团队中有一个新人,有少许几行代码,就足够让整个团队调试一整天。最近的一次,有位兄弟写了如下代码:   

燕良@游戏开发 3161

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Linux浮点运算:用户与内核的协作

Linux系统中的浮点运算主要由应用程序在用户空间发起,通过CPU的FPU硬件执行。编译器将高级语言代码转换为FPU指令,应用程序直接调用这些指令进行计算。内核负责关键支持:管理FPU状态切换、处理异常、提供基础运行环境。但内核自身极少使用浮点运算,主要出于性能、实时性和复杂性的考虑。简言之,应用程序是浮点运算的主体,内核提供必要支持但避免直接参与运算。

HTTP404_CN的博客 543

VB+浮点运算的的简单算法

标 题: 《编程百科全书》注册算法,VB+浮点运算,不过很简单的算法 作 者:laoqian 时 间:2005-02-04 16:29 链 接:http://bbs.pediy.com/showthread.php?threadid=10803 【破解作者】 laoqian[FCG] 【作者邮箱】 lao-qian@163.com 【作者主页】 www.FCGchina.co

独上高楼,望断天涯路 1154
上一篇: D语言中的内存管理技术
下一篇: D语言中的内联汇编在x86平台上的实现
uframer
博客等级 码龄22年 16粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值