boost:math.constants

1060 篇文章 293 订阅

概述

  • math.constants库提供了 π \pi π e e e 2 \sqrt[ ]{2 } 2 等常用的数学常数,支持float、double、long double精度,而且还支持自定义类型以获得更高的精度
  • math.constants库位于名字空间boost::math,需要包含头文件<boost/math/constants/constants.hpp>,即:
#include <boost/math/constants/constants.hpp>
using namespace boost::math;

基本用法

math.constants库定义了很多科学计算中用到的常数,精度高达小数点后100位,比较常用的有:

  • pi : 圆周率 π \pi π
  • e : 自然对数的底
  • root_tow : 2 \sqrt[ ]{2 } 2
  • root_three : 3 \sqrt[ ]{3 } 3
  • in_two : ln ⁡ 2 \ln{2} ln2

等等,这些都是编译期常数,没有运行时开销,所以运算效率很高

为了方便使用,math.constants库在名字空间boost::math里有定义了三个子名字空间,分别是float_constants、double_constants和long_double_constants,我们可以直接使用这些名字空间里对应的常数。

示例:

#include <iostream>
using std::cout;
using std::endl;

#include <boost/math/constants/constants.hpp>
using namespace boost::math;

//

void case1()
{
    cout << std::setprecision(64);         //设置显示精度位64位

    auto a = float_constants::pi * 2 * 2;
    cout << "area \t\t= " << a << endl;

    using namespace double_constants;

    auto x = root_two * root_three;
    cout << "root 2 * 3 \t= " << x << endl;

    cout << "root pi \t= " << root_pi << endl;
    cout << "pi pow e \t= " << pi_pow_e << endl;
}


int main()
{
    case1();
}

在这里插入图片描述

高级用法

math.constants库模仿C++14里的模板变量特性,在boost::math::constants里定义了同名的函数模板,可以不必使用名字空间直接指定数值类型。如果我们使用另一个数学库----高精度数据库boost.multiprecision,那么就可以获得比long double还要高的精确度:

#include <iostream>
using namespace std;


#include <boost/math/constants/constants.hpp>
using namespace boost::math;

#include <boost/multiprecision/cpp_dec_float.hpp>
void case1()
{
    using namespace constants;

    typedef decltype(pi<float>) pi_t;
    assert(is_function<pi_t>::value);  

    assert(pi<float>() == float_constants::pi);  // 函数模板获取pi值
    assert(pi<double>() == double_constants::pi); // double精度

    typedef boost::multiprecision::cpp_dec_float_100 float_100;
    cout << setprecision(100)			// 设置精度位100位
         << pi<float_100>() << endl;   // 100位小数浮点数
}


int main()
{
    case1();
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码存在一些问题,比如: 1. 在 Base 类中,没有实现对速度的限制,可能导致物体移动过快或过慢。 2. 在 Background 类中,没有考虑到循环播放背景图片的情况,会导致背景图片移动到屏幕底部后出现空白区域。 3. 在 main 函数中,调用了一个名为 a 的变量的 show 方法,但是 a 并不是一个对象,会导致 AttributeError 错误。 下面是修改后的代码: ```python import random import time import pygame from pygame.constants import * from pygame.image import load as addimage class Base(object): def __init__(self, image, x, y, screen): self.x = x self.y = y self.image = image self.screen = screen self.speedx = 0 self.speedy = 0 self.max_speed = 10 # 设置最大速度 def draw(self): self.screen.blit(self.image, (self.x, self.y)) def changespeed(self, x, y): if abs(self.speedx + x) < self.max_speed: # 控制速度不超过最大速度 self.speedx += x if abs(self.speedy + y) < self.max_speed: self.speedy += y def changespeedx(self, x): if abs(self.speedx + x) < self.max_speed: self.speedx += x def changespeedy(self, y): if abs(self.speedy + y) < self.max_speed: self.speedy += y def move(self): self.x += self.speedx self.y += self.speedy class Background(): def __init__(self): pygame.display.set_caption("Plane War Game") self.image1 = Base(addimage('./images/bg1.png'), 0, -1200) self.image2 = Base(addimage('./images/bg2.png'), 0, -600) self.image3 = Base(addimage('./images/bg3.png'), 0, 0) self.bgs = [] self.bgs.append(self.image1) self.bgs.append(self.image2) self.bgs.append(self.image3) self.speedy = 3 for bg in self.bgs: bg.changespeedy(self.speedy) def show(self): for bg in self.bgs: bg.move() bg.draw() if bg.y > 1800: # 判断是否到达屏幕底部 bg.y = self.bgs[self.bgs.index(bg)-1].y - 600 # 计算下一张图片的位置 def main(): maxsize = (800, 600) screen = pygame.display.set_mode(maxsize) bg = Background() # 实例化 Background 类 while True: bg.show() # 调用 Background 类的 show 方法 pygame.display.update() time.sleep(0.03) if __name__ == '__main__': main() ``` 修改后的代码增加了对速度的限制,使得物体移动更加平稳;在 Background 类中新增了循环播放背景图片的功能,避免了出现空白区域的问题;在 main 函数中,创建了 Background 类的实例,并调用其 show 方法来播放背景图片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值