浮点数

X64的函数调用规则

允我心安 提交于 2020-03-17 11:25:14
某厂面试归来,发现自己落伍了!>>> 闲着没事想研究一下gcc的函数调用方式和m$的__stdcall、__fastcall之类有何区别,本想是了解一下关于参数的入栈顺序和清理方,就随便写了个C函数,编译成.s文件,一看发现根本就没有push和pop之类的指令...两个int参数都是利用rsi和rdi传递!网上百度了一个关于m$平台x64的调用约定 看完ddk里相关的部分,总结下吧,规则倒是不复杂,相对x86时代的stdcall cdecl fastcall 三分天下要简明的多。按ddk里的说法,m$就是要趁这次统一调用规则…… -__- 在x64下函数调用的前4个参数总是放在寄存器中传递,剩余的参数则压入堆栈中。而x86上则是全部压入堆栈中(除了fastcall方式)。这4个用于存放参数的寄存器分别是:存放整数参数的RCX,RDX,R8,R9;存放浮点数参数的XMM0,XMM1,XMM2,XMM3。 按照所传参数是整数还是浮点数的不同,寄存器的使用规则如下: 全部整数参数: func1(int a, int b, int c, int d, int e); 参数a放入RCX,参数b放入RDC,参数c放入R8,参数d放入R9,参数e么压栈。 参数传递规则:按照参数表声明的顺序,从左向右,前4个参数依次放入RCX,RDX,R8,R9中。 全部浮点数参数: func1(float a,

平方根计算

我的未来我决定 提交于 2020-03-17 11:06:28
二分法 描述:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。 简单介绍:在有序的有N个元素的数组中查找用户输进去的数据x。 算法如下: 确定查找范围front=0,end=N-1,计算中项mid(front+end)/2。若a[mid]=x或front>=end,则结束查找;否则,向下继续。若a[mid]<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给front,并重新计算中项mid,继续执行步骤2;若a[mid]>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给end,并重新计算mid,继续执行步骤2。 以求解2的平方根的程序为基础,编程实现:输入一个浮点数,计算其平方根。要求如下: 不准使用如sqrt()的库函数代码必须上传并确保自己测试通过输入一个浮点数输出该浮点数的平方根 提示: 测试输出与标准测试结果不符的一种可能原因是计算精度不够,简单的解决方法是将循环计算的次数提高,如将20次提高到30次。 一定要考虑到根大于0的情况,而不是求根号2那样利用1.0这个下限。 测试说明测试输入:2 预期输出:1.41421 # include <iostream> using

C语言的浮点数储存

眉间皱痕 提交于 2020-03-17 09:15:39
最近在学习c语言,对浮点型数据的存储方式有些感兴趣,然后查资料了解了IEEE表示法:第一位是符号位0正1负,然后的八位是表示指数,最后23位表示尾数。对一个浮点数,首先将它规格化(就是整数部分为1的二进制表示),比如1.25就是1x2 0 +1x2 -2 ,就是1.01x2 0 ,它的指数部分为0,小数部分为0.01,小数部分就是浮点数的尾数部分,所以其尾数为0100000,00000000,00000000,00000000。至于为什么不保留整数部分的1,我想第一是为了多一位的精度,第二没必要,因为都规格化了整数部分都是1,然后是指数部分,指数部分要加上偏移量,我开始不明白,后面想明白了,如果没有偏移量,那么1.0和0.0的表示方法是一样的,会造成混淆,而计算机补码的0只有一种表示方法,怎么办?加上偏移量01111111就好了,这样我们把00000000,00000000,00000000,00000000定义为0,把00111111,10000000,00000000,00000000定义为1.0,而且这样00000000到11111111就是从小到大表示指数大小了,指数范围为(-127到128)所以浮点数的表示范围是2 -126 到2 128 。浮点数表示的精度为2 -23 =1.192e-7。既然知道原理,那就验证一下 float x=1.0; unsigned int*p

js精准计算

浪尽此生 提交于 2020-03-17 01:23:14
目录 js精准计算 js精准计算 var numA = 0.1; var numB = 0.2; alert( numA + numB ); 0.1 + 0.2 = 0.30000000000000004。 计算精度误差问题(和二进制相关)。 对于浮点数的四则运算,几乎所有的编程语言都会有类似精度误差的问题,只不过在 C++/C#/Java 这些语言中已经封装好了方法来避免精度的问题,而 JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。 我们先把 0.1 和 0.2 转换成二进制看看: 0.1 => 0.0001 1001 1001 1001…(无限循环) 0.2 => 0.0011 0011 0011 0011…(无限循环) 双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100110011001100 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。 如何解决呢? 首先将数乘以10的幂次方去掉小数位得到可以转化二进制的整数,计算之后再还原。 /** ** 除法函数,用来得到精确的除法结果 ** 说明

Java 数据类型

て烟熏妆下的殇ゞ 提交于 2020-03-16 03:22:23
基本数据类型 Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。 byte: byte数据类型是8位、有符号的,以二进制补码表示的整数; 最小值是-128(-2^7); 最大值是127(2^7-1); 默认值是0; byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一; 例子:byte a = 100,byte b = -50。 short: short数据类型是16位、有符号的以二进制补码表示的整数 最小值是-32768(-2^15); 最大值是32767(2^15 - 1); Short数据类型也可以像byte那样节省空间。一个short变量是int型变量所占空间的二分之一; 默认值是0; 例子:short s = 1000,short r = -20000。 int: int数据类型是32位、有符号的以二进制补码表示的整数; 最小值是-2,147,483,648(-2^31); 最大值是2,147,483,647(2^31 - 1); 一般地整型变量默认为int类型; 默认值是0; 例子:int a = 100000, int b = -200000。 long: long数据类型是64位、有符号的以二进制补码表示的整数; 最小值是-9,223,372,036,854,775

1.1空格分隔输出

倾然丶 夕夏残阳落幕 提交于 2020-03-14 18:37:36
描述 读入一个字符,一个整数,一个单精度浮点数,一个双精度浮点数,然后按顺序输出它们,并且要求在他们之间用一个空格分隔。输出浮点数时保留6位小数。 输入共有四行:第一行是一个字符;第二行是一个整数;第三行是一个单精度浮点数;第四行是一个双精度浮点数。输出输出字符、整数、单精度浮点数和双精度浮点数,之间用空格分隔。样例输入 a 12 2.3 3.2 样例输出 a 12 2.300000 3.200000 #include<iostream> #include<cmath> #include<cstring> #include<ctime> #include<cstdio> #include<iomanip> #include<queue> using namespace std; int main() { char a; int s; float d; double f; cin>>a>>s>>d>>f; cout<<a<<" "<<s<<" "; printf("%0.6f",d); cout<<" "; printf("%0.6f",f); return 0; }    来源: https://www.cnblogs.com/lipeiyi520/p/8428048.html

空格分隔输出

为君一笑 提交于 2020-03-14 18:35:04
总时间限制:1000ms内存限制:65536kB 描述 读入一个字符,一个整数,一个单精度浮点数,一个双精度浮点数,然后按顺序输出它们,并且要求在他们之间用一个空格分隔。输出浮点数时保留6位小数。 输入 共有四行: 第一行是一个字符; 第二行是一个整数; 第三行是一个单精度浮点数; 第四行是一个双精度浮点数。 输出 输出字符、整数、单精度浮点数和双精度浮点数,之间用空格分隔。 样例输入 a 12 2.3 3.2 样例输出 a 12 2.300000 3.200000#include<stdio.h>int main(){char ch;int a;float b;double c;scanf("%c\n",&ch);scanf("%d\n",&a);scanf("%f\n",&b);scanf("%lf",&c);printf("%c %d %.6f %.6f",ch,a,b,c);return 0;} 来源: https://www.cnblogs.com/hkybczm/p/7418596.html

06:空格分隔输出

♀尐吖头ヾ 提交于 2020-03-14 18:33:49
描述 读入一个字符,一个整数,一个单精度浮点数,一个双精度浮点数,然后按顺序输出它们,并且要求在他们之间用一个空格分隔。输出浮点数时保留6位小数。 输入共有四行: 第一行是一个字符; 第二行是一个整数; 第三行是一个单精度浮点数; 第四行是一个双精度浮点数。输出输出字符、整数、单精度浮点数和双精度浮点数,之间用空格分隔。样例输入 a 12 2.3 3.2 样例输出 a 12 2.300000 3.200000 #include<stdio.h> int main() { int k; float n; double m; char a; scanf("%c%d%f%lf",&a,&k,&n,&m); printf ("%c %d %.6f %.6lf",a,k,n,m); return 0; } 来源: https://www.cnblogs.com/fripSide-satoshi/p/4995387.html

opencv 中CV_32F和CV_64读取数据结果不一致

有些话、适合烂在心里 提交于 2020-03-12 12:59:08
我需要读取matlab生成的txt,里面存放着3*3的矩阵,我在尝试用opencv读取txt 并转存为yaml文件时出现了问题。 原始数据 3.2212523e-01 -3.2059794e-02 -7.1996807e-05 9.0743866e-02 4.9048730e-01 8.8287459e-05 4.8554884e+02 2.2995003e+02 1.0000000e+00 原始opencv 代码 ifstream infile; infile.open(strtemp); //打开原始txt路径 float data[3][3]; //存放读取的3*3矩阵 for (int k = 0; k<3; k++) { for (int h = 0; h<3; h++) { infile >> data[k][h]; } } Mat datatemp;//转换为Mat datatemp = Mat(3, 3, CV_32FC1, data);//数组内容写入Mat string str1 = ".\\data\\matrix\\c2proMatrix-"; string strtemp1 = str1 + to_string(i) + "-" + to_string(j) + ".txt"; FileStorage wstemp(strtemp1,

计算机组成和体系结构Day03:计算机的数据表示

孤街浪徒 提交于 2020-03-12 07:20:16
第二章 计算机的数据表示 目录 第二章 计算机的数据表示 0x00 数据编码的概念 0x01 数值数据的编码 (1)定点数的存储形式:小数点固定的数 (2)浮点数的编码表示: 非标准浮点数的表示: <1>浮点数尾数的规格化: <3>n位浮点数的表示范围: <4> IEEE754标准浮点数的表示: 0x00 数据编码的概念 数据是计算机处理的对象 分类: 数值数据 非数值数据 数据必须经过编码才能被计算,处理,存储,传输 编码是采用少量 基本符号(0,1) 规定一系列组合 规则 来表示大量复杂的信息。 基本符号: 位:bit 最基本的存储单元 位运算:与& 或| 非^ 异或 思想: 两个数相加求全集,全集中减去自己就是对方。 异或可以理解为二进制加法。 自己异或自己=0 问题: 第一种如果两个地址相同就完蛋了 第二种如果两个数相等就完蛋了 字节:8bit int x = 0x ff 11 22 小端系统:数值高位 放在 内存地址高位 数值地位放在 内存地址低位 大端系统:正好相反 字:2个字节或者4个字节 作业5.14 (2) 3 (3) 大端系统: 0x01 数值数据的编码 (1)定点数的存储形式:小数点固定的数 分为纯整数和纯小数 如果将小数点约定到最低位之后,那就是纯整数 并且如果约定最高为表示符号,可以表示正负。 如果没有约定最高位表示符号,则只能表示正