当前位置:首页 > 技术 >

double和float的用法(什么时候用float什么时候用double)

来源:原点资讯(www.yd166.com)时间:2023-04-16 04:13:52作者:YD166手机阅读>>

我记得世纪之初的时候,某本古老的书上有这么一句话,大概是这个意思,无论是float还是double,在CPU内部都是转换为80位浮点数运算的,因此float和double其实是一样快的。

但是时代变化太快,这句话现在还对不对呢?写了个程序验证一下。使用的是Visual C 2015 Update 2,编译为x64架构。为了避免调试器的干扰,直接使用Ctrl F5运行。

程序如下:

// realspeed.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdio.h>#include <windows.h>#define veclen 1048576float vec1[veclen];float vec2[veclen];float vec3[veclen];double dvec1[veclen];double dvec2[veclen];double dvec3[veclen];int main(){

Debug下Ctrl F5直接运行:

double和float的用法,什么时候用float什么时候用double(1)

Release下Ctrl F5直接运行:

double和float的用法,什么时候用float什么时候用double(2)

可以看到,在Release编译下,float比double快得多,而在Debug编译下则几乎没有差别。这是为什么呢?在这里我们设置了个断点,进行一下反编译——

Debug下的反编译:

// realspeed.cpp : 定义控制台应用程序的入口点。

Release下的反编译:

// realspeed.cpp : 定义控制台应用程序的入口点。

可以看到,现在早已过了x87 FPU的年代,编译器并没有使用FPU指令,而是使用的SSE指令。

Debug编译下,为了调试方便,将每一个循环都完整表现出来了(循环计数为100000h,即1048576),并且使用了movss/mulss和movsd/mulsd这两组标量指令,速度当然差不多。

而Release编译下,则将循环计数精简为20000h(131072=1048576/8)和40000h(262144=1048576/4),并且使用了movups/mulps和movups/mulpd这两组矢量指令,每次循环内进行2次运算,总计进行40000h(262144=1048576/4)和80000h(524288=1048576/2)次运算。由于SSE寄存器是固定的128位宽,每次只能放置4个32位宽的float或2个64位宽的double数据,因此使用float的话,只需要进行1/4次运算,而使用double的话,则需要进行1/2次运算。

结论就是:对于标量运算,float和double没有显著差别,而对于矢量运算,float比double要快。

因此,在计算量庞大的图形运算中,通常使用float而不是double以提高运算速度。

上面演示的是四则运算,编译器自然有充足的弹性进行优化。那如果是像exp、log这样的math.h函数,编译器怎么优化呢?比如下面的代码:

// realspeed.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdio.h>#include <windows.h>#include <math.h>#define veclen 1048576float vec1[veclen];float vec2[veclen];float vec3[veclen];double dvec1[veclen];double dvec2[veclen];double dvec3[veclen];int main(){

我们看一下Release反汇编就知道了。Release反汇编如下:

// realspeed.cpp : 定义控制台应用程序的入口点。

可以看到,编译器并没有调用logf和log函数,而是调用了__vdecl_logf4和__vdecl_log2函数。因此,即使是使用了math.h中的数学函数,仍然可以实现矢量运算优化。

栏目热文

相机的白平衡新老手都这样设置(相机白平衡正确使用方法)

相机的白平衡新老手都这样设置(相机白平衡正确使用方法)

很多初学摄影的人刚接触相机时,一脸茫然不知道相机菜单栏里的各种参数该怎么设置,也不知道怎样设置参数才能拍出自己想要的效果...

2023-04-16 04:31:00查看全文 >>

相机白平衡在哪里调节(相机白平衡的调节平时需要吗)

相机白平衡在哪里调节(相机白平衡的调节平时需要吗)

使用相机拍摄,除了设置曝光三要素之外,白平衡也是非常重要的一个参数。今天我们就围绕白平衡来展开,希望大家能够学会白平衡的...

2023-04-16 04:08:07查看全文 >>

如何精准设置相机白平衡(相机调白平衡最佳方法)

如何精准设置相机白平衡(相机调白平衡最佳方法)

相机的白平衡,是对画面色彩有直接影响的参数。往复杂方向说,涉及到色温变化、冷暖调的画面效果、正确的白平衡和效果的营造;通...

2023-04-16 04:04:08查看全文 >>

相机白平衡怎么调整最佳(相机怎样调整白平衡最准确)

相机白平衡怎么调整最佳(相机怎样调整白平衡最准确)

白平衡,是为了还原照片中的环境色彩,不会出现偏色,维持“白色”的平衡。白平衡的实质是调整相机中的色温参数,物理学上的色温...

2023-04-16 04:35:12查看全文 >>

相机白平衡在哪设置(如何正确调整相机白平衡)

相机白平衡在哪设置(如何正确调整相机白平衡)

相机的白平衡已经反复讲了多遍,今天系统给大家进行讲解,分为两个讲解方式:简单理解和详细讲解。一、简单理解白平衡就是决定画...

2023-04-16 04:24:20查看全文 >>

double和float的优势(float和double用起来有什么区别)

double和float的优势(float和double用起来有什么区别)

float 单精度浮点数在机内占 4 个字节,用 32 位二进制描述。double 双精度浮点数在机内占 8 个字节,用...

2023-04-16 04:15:10查看全文 >>

double 和float哪个范围大(float和double哪个类型好)

double 和float哪个范围大(float和double哪个类型好)

要想理解 float 和 double 的取值范围和计算精度,必须先了解小数是如何在计算机中存储的:举个例子:78.37...

2023-04-16 04:26:18查看全文 >>

c语言float和double的区别(c语言float和double保留小数点后几位)

c语言float和double的区别(c语言float和double保留小数点后几位)

首先变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,另一种是强制转换。 自动转换即当不同类型的数据进行混...

2023-04-16 04:15:42查看全文 >>

float和double怎么使用(float和double的数值范围)

float和double怎么使用(float和double的数值范围)

为了表示浮点数,我们使用float,double和long double,有什么不同 ?double的精度是float的...

2023-04-16 04:14:06查看全文 >>

double和float有什么区别(double和float哪个优先)

double和float有什么区别(double和float哪个优先)

float是单精度类型,精度是8位有效数字,取值范围是10的-38次方到10的38次方,float占用4个字节的存储空间...

2023-04-16 04:30:49查看全文 >>

文档排行