manout's blog

Something about me

  以前没怎么注意过 C++ 的输入输出以及四舍五入这种细枝末节的问题,但是做些竞赛题发现这些边角料用到的地方还很多.
  这里记下 C++ 中实现四舍五入的库函数,自己实现小数点后任意位的四舍五入,以及通过控制输出来进行四舍五入.

相关库函数

  1. double round(double x) 四舍五入到相邻整数
  2. double floor(double x) 向下取整
  3. double ceil(double x) 向上取整
  4. double trunc(double x) 向 0 取整

  详细介绍见 CPP reference.

保留小数点后任意位数并四舍五入的实现

1
2
3
4
5
6
double round(double num, int fig)
{
int shift = static_cast<int>(std::pow(10, fig));
double half = num >= 0 ? 0.5f : -0.5f;
return int(num * shift + half) / double (shift);
}

iomanip 控制输出

  C++ iomanip 头文件中包含对输入输出进行控制的相关工具.
  以下操作符的作用均是持续的.

  如果只是在输出时要求保留几位有效数字,使用 std::setpecision 是最方便的.
  此操作符控制浮点数输出时显示的数字个数,会进行四舍五入.
  该操作符影响之后的所有输出,直到再次使用 std::setpecision 为止.

  当末尾最后几位为 0 时,0 是无法输出的.需要使用 std::showpoint
  如果是要保留小数点后多少位有效数字,可使用 ios::fixed 将小数点固定,该操作符更改浮点数的输入/输出的默认格式.
  使用std::fixed 将小数点固定后,对此输出流对象 setpecision 的含义变为小数点后保留多少为有效数字,最后一次设置有效.

  通常这些操作符的使用方法是作为流运算符的右参数,此时使用 std 命名空间中的函数
  等效的简单方法是使用流对象的 setf 方法设置,此时操作符使用 ios 中的 flag.

1
2
3
4
5
6
7
8
9
10
/** 输出 PI, 保留五位有效数字,四舍五入*/
std::cout << std::setpecision(5) << M_PI;
/** 输出: 3.1416*/
std::cout << std::setpecision(6) << M_PI;
/** 输出: 3.14159*/
std::cout << std::setpecision(6) << std::showpoint << 1.001000;
/** 输出: 1.001000*/
std::cout.setf(ios::showpoint);
/** 固定小数点, 后面位数设置为 setpecision(6)*/
std::cout.setf(ios::fixed);

  从 github 上 clone repository 时速度过慢,甚至达到 2.00 KiB/s 夸张的速度,解决方式是科学上网,似乎开启 shadowsocks 后在系统设置全局代理并不起作用,如果要 git 走代理需要在 git config 中设置才可以.

  设置科学上网当然要开启 shadowsocks, 设置本机地址 127.0.0.1, 本机端口 1080.

  git 设置代理可以设置全局代理即所有 host 都走代理,也可以针对单独一个 host 设置代理即只 clone 此 host 上的 repository 时才走代理.由于本人的 VPS 在美国,所以只对 github 设置代理.

  shadowsocks 暴露的协议为 socks5,所以设置时的代理前缀为 socks5.

具体命令

1
2
3
4
5
6
7
# 设置 http, https 的代理
git config --global http.https://github.com.proxy socks5://127.0.0.1:1080
git config --global https.https://github.com.proxy socks5://127.0.0.1:1080

# 要取消设置的http, https 代理,命令如下
git config --global --unset http.proxy
git config --global --unset https.proxy

  git clone 自己一个 repository 时速度不仅奇慢而且到中间常出现如下错误.

1
2
3
4
error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.
fatal: The remote end hung up unexpectedly
fatal: early eof
fatal: index-pack failed

  经过搜索发现是 curl 下载时的 buffer 过小导致的,这个 repository 确实有比较大的文件.所以更改下 postbuffer 的大小.

1
2
git config --global http.postbuffer 24288000
git config --global https.postbuffer 24288000

  以上是针对 git 的第一条错误提示搜索的解决办法,同样的仅针对 early eof 错误而言,也有解决办法.
  从 remote host 上下载 repository 时服务器端会默认先压缩目标文件再进行传输,客户端再解压.压缩指数范围为 [-1, 9], -1 以 zlib 为默认压缩库, 0 不压缩, 1 … 9 为压缩速度与最终文件大小的权衡,数字越大,压缩越慢,但最终获得的目标文件也就越小.
  stackoverflow上有人测试发现关掉压缩功能或者设置为 -1 能够避免出现 early eof.

1
2
3
4
# 关闭压缩功能
git config --global --all core.compression 0
# 设置为 -1
git config --global --all core.compression -1

  bandwagon 官方提供更换 IP 的服务, 以前收费是 8 美元(折合人民币 50 元左右),不知从什么时候降价到了 2.82 美元(折合人民币 18 元左右),但其实在自己购买的 VPS 的 KiwVM control panel 里就可以更换 ip, 如果只是需要更换 ip 的话(比如自己搭的的梯子被禁这种事情),可以通过这种方式免费更换ip.

  首先进入 VPS 的 control panel 里,停止 VPS 的运行.

stopVPSbtn

  然后选择左侧 Migrate to another DC.

select_other_DC

  在以下列表中选择除后面为 current 以外的地区,如果只是切换 Los Angeles 的不同机房,速度上的差异应该不大,切换到其他地方速度不能保证.

otherDC

  然后点击 confirm on next step, 切换到新机房用时几分钟到几小时不等,与 VPS 上用户的数据量有关,提示说会把全部的数据拷贝过去,切换过去后需要手动开启 VPS 和 shadowsocksR server 服务.

  建模是不可能建模的,这辈子也不可能建模的,只有胡乱写点 matlab 才能维持得了生活这样子,队里的大佬都是人才说话又好听,超喜欢在里面的...

ease

never

longface

0%