`
qiezi
  • 浏览: 492176 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

强类型数值计算

    博客分类:
  • D
阅读更多
以前曾经讨论过使用typedef来完成强类型的数值计算,最终遇到的问题是D里面没办法定义进行全局运算符重载。

最近在struct上找到点灵感,把基本类型用struct包装后使用,就可以重载运算符了,当然效率也是有保证的,D前几个版本已经完成了NRVO,struct也可以在栈上分配,所以不用担心性能,不过编译时注意打开-O选项。

简单测试了一下,性能与基本类型基本上没有差别:
template WrapStruct(T)
{
	T value;

	T opCast()
	{
		return value;
	}

	typeof(*this) opAssign(T)(T v)
	{
		value = v;
		return *this;
	}

	static typeof(*this) opCall(T)(T v)
	{
		typeof(*this) result;
		result.value = v;
		return result;
	}
}


struct Length
{
	mixin WrapStruct!(float);

	Time opDiv(Speed speed)
	{
		return Time(value / speed.value);
	}
	
	Speed opDiv(Time time)
	{
		return Speed(value / time.value);
	}

	char[] toString()
	{
		return std.string.format("%f m", value);
	}
}

struct Speed
{
	mixin WrapStruct!(float);

	Length opMul(Time time)
	{
		return Length(value * time.value);
	}

	char[] toString()
	{
		return std.string.format("%f m/s", value);
	}
}

struct Time
{
	mixin WrapStruct!(float);

	Length opMul(Speed speed)
	{
		return Length(value * speed.value);
	}

	char[] toString()
	{
		return std.string.format("%f s", value);
	}
}


import std.stdio;
import std.date;

void main()
{
	{
		Length length = 30;
		Speed speed = 3;
		Time time = length / speed;
		assert(cast(float)time == 10);

		time = 5;
		speed = length / time;
		assert(cast(float)speed == 6);
	}

	{
		long start = getUTCtime();
		float length = 3;
		float speed = 1.5;
		float time;
		for (int i=0; i<100000000; ++i)
		{
			time = length / speed;
		}
		writefln(getUTCtime() - start);
	}

	{
		long start = getUTCtime();
		Length length = 3;
		Speed speed = 1.5;
		Time time;
		for (int i=0; i<100000000; ++i)
		{
			time = length / speed;
		}
		writefln(getUTCtime() - start);
	}
}
分享到:
评论
12 楼 qiezi 2007-04-12  
是这样的 
11 楼 soulmachine 2007-04-12  
我以为你能用C++的宏和typedef引入新的类型,开始很是惊奇。现在你的意思是:用C++的带参宏取代D的模板。我的意思再明确一下,不知对不对:C++中引入新的类型只能用struct或class自定义,而D中则多了一个手段,就是typedef。
10 楼 qiezi 2007-04-12  
我说的typedef就是D里面的,本身就是强类型的:
typedef int Length;
typedef int Time;

这2个类型不能相互赋值,除非强制转型。就连int要赋给Length也要转型,这可能不如上面写的struct方便。改用struct的主要原因就是D里面无法重载全局运算符。

我说C++宏可以实现mixin的功能,这个功能原本就是宏做的事啊。演示代码把上面的D模板改成宏就行了,语法上处理成C++的,肯定也很容易写。
9 楼 soulmachine 2007-04-12  
#include <iostream>

typedef int  myInt1;
typedef int  myInt2;

int main(int argc, char* argv[])
{
myInt1 a = 1;
myInt2 b = 2;
b = a;
std::cout << b;
return 0;
}

#include <iostream>

#define myInt1 int 
#define myInt2 int 

int main(int argc, char* argv[])
{
myInt1 a = 1;
myInt2 b = 2;
b = a;
std::cout << b;
return 0;
}

在C++中宏和typedef只是为类型取了别名,并不象D中的typedef那样引入了新的类型。qiezi能否给出一段用宏或typedef提供更丰富类型的代码?
8 楼 qiezi 2007-04-12  
C++也可以用宏的,D的语法是要简洁一些。原本想用typedef,更轻量一些,后来发现还是得用struct。
7 楼 soulmachine 2007-04-12  
在C++把同一个基本类型提升为更强的类型,似乎只能用struct 或class对其进行封装(目前只知道这种做法)。你的这段代码核心是一样的,用了struct提供更强的类型,只不过你用了D特有的mixin减少了代码量,看起来简洁了许多
6 楼 qiezi 2007-04-11  
在不降低效率的前提下,提供更强的类型,当然也就是更丰富的值语义。C++也有类似的库这样实现,不过C++模板编译效率无法忍受,D在这方面要好得多。
5 楼 oldrev 2007-04-10  
今天够多产的啊,哈哈
4 楼 h_rain 2007-04-10  
哈哈哈哈!还行,我猜到了!
呵呵,这回也把附加功能加入了!

漂亮!
3 楼 qiezi 2007-04-10  
Length length = 3;
Time time = 2;
writefln("Length: ", length, ", Time: ", time, ", speed: ", length / time);

输出:
引用

Length: 3.000000 m, Time: 2.000000 s, speed: 1.500000 m/s
2 楼 qiezi 2007-04-10  
类型安全啊,Time * Time是不能编译通过的,当然你可以定义Length * Length结果是一个面积,你Length * Length的结果赋给一个Length或是Time都是没办法编译通过的,虽然它们只包含一个数值。有些数学(或物理?)库比较需要这种,当然我只简单探讨了一下,深入了我就外行了。
1 楼 h_rain 2007-04-10  
封装的很漂亮!

时间*速度=长度
速度*时间=长度
长度/速度=时间
长度/时间=速度

呵呵,很有趣!

只是,我没有明白,这种封装用于什么用途才有实际价值?
安全?附加功能?高层抽象?

相关推荐

    Fortran自由函数集合练习

    1. **数值计算能力强**:Fortran是一种专门为数值计算和科学计算设计的语言。它提供了丰富的数学库和函数,用于实现各种数学运算、矩阵操作和数值方法。 2. **高性能和效率**:由于Fortran的历史悠久,编译器和优化...

    数值分析软件 v1.1

    另外,对一些函数的求导问题,其求导、微分也相当复杂,也有必要研究求导、微分的数值计算问题。本软件就是针对这些问题而设计的,内容包括:牛顿-柯特斯(Newton-Cotes)公式、复化求积公式、高斯求积公式、绘制...

    数值分析软件 v1.1 2008年最新版

    另外,对一些函数的求导问题,其求导、微分也相当复杂,也有必要研究求导、微分的数值计算问题。该部分就是针对这些问题而设计的,内容包括:牛顿-柯特斯(Newton-Cotes)公式、复化求积公式、高斯求积公式、绘制...

    数值分析软件 v1.1 2009年9月最新版(简体中文)

    另外,对一些函数的求导问题,其求导、微分也相当复杂,也有必要研究求导、微分的数值计算问题。该部分就是针对这些问题而设计的,内容包括:牛顿-柯特斯(Newton-Cotes)公式、复化求积公式、高斯求积公式、绘制...

    数值分析软件 v1.1 2009年最新版(简体中文)

    另外,对一些函数的求导问题,其求导、微分也相当复杂,也有必要研究求导、微分的数值计算问题。该部分就是针对这些问题而设计的,内容包括:牛顿-柯特斯(Newton-Cotes)公式、复化求积公式、高斯求积公式、绘制...

    Python的数据类型及其应用.docx

    数字类型的应用场景最丰富的是在编写数值计算、逻辑判断、循环控制等算法设计时,特别是在数据分析和科学计算中更加常用。 整数(int): Python中的整数运算是准确的,不会出现误差,因此在一些和数值密切相关的...

    05. 数据类型与浮点数.docx

    Fortran语言具有很强的数学计算能力,支持复杂的数学运算和科学计算,包括矩阵运算、数值计算、统计分析等。它还具有高效的性能,可以生成高效的机器代码,使得程序在运行时能够快速执行。 Fortran语言在科学和工程...

    软岩巷道补强加固技术应用

    通过FLAC3D程序对该补强支护进行数值模拟,计算结果表明:实施该补强加固后,31轨道巷的塑性区分布、顶板下沉量、底鼓量和两帮移近量都较原支护形式有显著降低,现场围岩变形量观测数据也验证了该补强加固的有效性。

    计算方法与软件应用

    它不仅具有强大的数值计算功能,可以处理如:矩阵计算、微积分运算、各种方程的求 解、插值和拟合计算、完成各种统计和优化问题,最新的版本甚至可以进行数字图象处理、小波分析等;同时它还有方便的画图功能和完善...

    王庄煤矿不同破坏类型煤体结构差异性及其对瓦斯吸附性能的研究

    采用低温液氮吸附法分析了不同破坏类型煤样的孔隙结构特征,通过FHH公式计算了煤体孔隙分形维数,并针对不同变形破坏程度煤的结构差异性进行了对比分析。结果表明:不同破坏类型煤样的瓦斯吸附能力差异显著,煤样的...

    【02-数据类型与运算符】

     •Java语言是一个强类型语言。  –所有变量,必须先声明类型,再使用。  –指定类型的变量,只能装对应的类型的数据。什么样的瓶子装什么样的酒。  •Java 语言支持的类型分为两大类: 基本数据类型和引用...

    均匀环境中气泡羽流的数值模拟 (1999年)

    以往对气泡羽流的理论分析,主要集中在半经验性的积分模型方面,对其流动结构揭示很少.应用作者给出的气一液两相流两方程湍流模型及混合有限...数值计算结果与实验相比,吻合很好,从而也验证了湍流模型的正确有效性.

    VB 超强的API浏览器 (源代码)

    在声明C#结构体时如果结果体中有数值数组类型, 结构体中的这个成员会被声明成不安全代码, 若要正确编译代码 ,请在单击VS.net中“项目”菜单“属性”菜单项, 在出来的选项卡上选择“生成”, 选中那个选项卡中的...

    北京师范大学-计算机应用基础作业(一至九全套).doc

    A数据处理主要应用于数值计算 B辅助设计是用计算机进行产品设计和绘图 C过程控制只能应用于生产管理 D计算机主要用于人工智能 12.当前计算机的应用领域极为广泛,但其应用最早的领域是__B__。 A数据处理 B科学计算 ...

    论文研究 - 剪力类型对混凝土板抗冲性的影响

    扁平混凝土板的冲切剪切破坏是一种复杂的现象,具有脆性破坏模式,这意味着结构突然破坏并Swift降低了承载能力。... 根据数值结果的比较,计算出了欧洲规范2中使用的设计公式的分项系数,发现该分项系数高于实际值。

    计算机应用基础(2021年修订版).doc

    计算机进展数值计算时的高准确度主要决定于D.根本字长 24.计算机具有的逻辑判断才能,主要取决于c.编制的软件 25.计算机的通用性使其可以求解不同的算术和逻辑问题,这主要取决于计算机的c.可 编程性 26....

    穿煤层倾斜巷道围岩弱结构分析及支护技术

    为解决穿煤层倾斜巷道穿层阶段地质条件变化复杂、存在多种巷道围岩弱结构、容易破坏失稳、支护困难的问题,重点分析了巷道穿层过程中存在的典型弱结构类型及其变形破坏特征,并运用数值计算软件FLAC3D模拟分析了不同围...

    关于数据结构课程设计指导书

    学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。课程设计是加强学生实践能力的一个强有力手段。课程设计所安排的题目,在难度和深度方面都大于平时的上机训练,要求同学在完成...

    数据结构课程设计指导书

    学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。课程设计是加强学生实践能力的一个强有力手段。课程设计所安排的题目,在难度和深度方面都大于平时的上机训练,要求同学在完成...

    2019全国计算机一级MsOffice应用基础知识点汇总.docx

    二、电子计算机的发展方向 从类型上看,电子计算机技术正在向巨型化、微型化、网络化和智能化方向发展。 未来新一代的计算机 一般来说,信息技术包含三个层次的内容:信息基础技术、信息系统技术和信息应用技术。 ...

Global site tag (gtag.js) - Google Analytics