小编les*_*ode的帖子

使用最新Haswell芯片的VS2013编译器在x64中进行数值回归?

我们最近开始看到我们的构建机器上的单元测试失败(某些数值计算超出了容差).经过调查,我们发现我们的一些开发人员无法重现测试失败.简而言之,我们最终将问题追溯到似乎是舍入错误的问题,但是这个错误只发生在最新Haswell芯片(我们的构建服务器最近升级到其上)的x64版本上.我们缩小了范围并从我们的一个测试中取出了一个计算:

#include "stdafx.h"
#include <cmath>

int _tmain(int argc, _TCHAR* argv[])
{
  double rate = 0.0021627412080263146;
  double T = 4.0246575342465754;
  double res = exp(-rate * T);
  printf("%0.20e\n", res);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我们在VS2013中编译这个x64(包括默认的编译器开关/fp:precise)时,它会在较旧的Sandy Bridge芯片和较新的Haswell芯片上给出不同的结果.不同之处在于第15位有效数字,我认为这两位机器上的机器epsilon都是双倍的.

如果我们在VS2010或VS2012(或者顺便说一下,VS2013 x86)中编译相同的代码,我们在两个芯片上得到完全相同的答案.

在过去几年中,我们经历了许多版本的Visual Studio和许多不同的英特尔芯片进行测试,没有人能够回想起我们必须根据芯片之间的不同舍入误差来调整我们的回归测试期望.

这显然导致了开发人员与旧版和新版硬件之间的游戏,以及对测试的期望应该是什么......

在VS2013中是否存在我们需要使用的编译器选项以某种方式缓解差异?

更新:

Results on Sandy Bridge developer PC:
VS2010-compiled-x64: 9.91333479983898980000e-001
VS2012-compiled-x64: 9.91333479983898980000e-001
VS2013-compiled-x64: 9.91333479983898980000e-001

Results on Haswell build server:
VS2010-compiled-x64: 9.91333479983898980000e-001
VS2012-compiled-x64: 9.91333479983898980000e-001
VS2013-compiled-x64: 9.91333479983899090000e-001
Run Code Online (Sandbox Code Playgroud)

更新:

我使用procexp来捕获加载到测试程序中的DLL列表.

Sandy Bridge developer PC:
apisetschema.dll
ConsoleApplication8.exe
kernel32.dll
KernelBase.dll
locale.nls
msvcr120.dll
ntdll.dll

Haswell build server: …
Run Code Online (Sandbox Code Playgroud)

visual-c++ visual-studio-2013

17
推荐指数
1
解决办法
884
查看次数

DateTime和xsd:date的往返XML序列化?

好的,我在这里错过了什么?MSDN对DateTimeSerializationMode说以下内容:

在.Net Framework的2.0及更高版本中,将此属性设置为RoundtripDateTime,以检查它们是在本地,UTC还是未指定的时区,并以保持此信息的方式进行序列化.这是默认行为,建议用于所有不与旧版本框架通信的新应用程序.

然而:

namespace ConsoleApplication1 {
    public class DateSerTest {
        [XmlElement(DataType = "date")]
        public DateTime Date { get; set; }
    }

    class Program {
        static void Main(string[] args) {
            DateSerTest d = new DateSerTest { 
                Date = DateTime.SpecifyKind(new DateTime(2009,8,18), DateTimeKind.Utc),
            };
            XmlSerializer ser = new XmlSerializer(typeof(DateSerTest));
            using (FileStream fs = new FileStream("out.xml", FileMode.Create)) {
                ser.Serialize(fs, d);
            }

            // out.xml will contain:
            // <Date>2009-08-18</Date>

            using (FileStream fs = new FileStream("out.xml", FileMode.Open)) {
                DateSerTest d1 = (DateSerTest) ser.Deserialize(fs);
                Console.WriteLine(d1.Date); // yields: …
Run Code Online (Sandbox Code Playgroud)

.net datetime xml-serialization

12
推荐指数
1
解决办法
8947
查看次数

如何强制XmlWriter正确处理命名空间?

我想使用XmlWriter写这样的东西(所有在一个命名空间中):

<Root xmlns="http://tempuri.org/nsA">
  <Child attr="val" />
</Root>
Run Code Online (Sandbox Code Playgroud)

但我能得到的最接近的是:

<p:Root xmlns:p="http://tempuri.org/nsA">
  <p:Child p:attr="val" />
</p:Root>
Run Code Online (Sandbox Code Playgroud)

使用此代码:

using System;
using System.Text;
using System.Xml;

namespace ConsoleApplication1
{
    internal class Program
    {
        private const string ns = "http://tempuri.org/nsA";
        private const string pre = "p";

        private static void Main(string[] args)
        {
            var sb = new StringBuilder();
            var settings = new XmlWriterSettings
                     {
                       NamespaceHandling = NamespaceHandling.OmitDuplicates, 
                                             /* ineffective */             
                       Indent = true
                     };
            using (XmlWriter writer = XmlWriter.Create(sb, settings))
            {
                writer.WriteStartElement(pre, "Root", ns);
                writer.WriteStartElement(pre, "Child", ns); …
Run Code Online (Sandbox Code Playgroud)

xml xmlwriter .net-4.0 xml-namespaces

7
推荐指数
1
解决办法
2336
查看次数

WCF:如何跟踪邮件正文?

我正在尝试诊断在相对简单的服务主机进程(Service.exe)中自托管的WCF服务.

我配置了Service.exe.config:

<?xml version="1.0" ?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" 
              switchValue="All"
              propagateActivity="true">
        <listeners>
          <add name="traceListener" 
               type="System.Diagnostics.XmlWriterTraceListener" 
               initializeData= "c:\temp\Service.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
  <system.serviceModel>
    <diagnostics>
      <messageLogging maxMessagesToLog="1"
                      maxSizeOfMessageToLog="2147483647"
                      logEntireMessage="true"
                      logMessagesAtServiceLevel="true"
                      logMalformedMessages="true"
                      logMessagesAtTransportLevel="true">
      </messageLogging>
    </diagnostics>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.0"
                      sku=".NETFramework,Version=v4.0" />
  </startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)

当我查看生成的svclog文件时,我看到记录了许多跟踪事件(我只希望记录第一条消息),并且所跟踪的消息都没有显示消息体(仅标题).

我相信我必须在这里遗漏一些简单的东西,但我看不到它.

更新:当我查看WCF配置编辑器时,"诊断"下有两个部分:MessageLogging和Tracing.当我单击"EnableMessageLogging"链接时,我的配置文件会更新:

  <system.diagnostics>
    <sources>
      <source propagateActivity="true" name="System.ServiceModel" switchValue="All">
        <listeners>
          <add type="System.Diagnostics.DefaultTraceListener" name="Default">
            <filter type="" />
          </add>
          <add initializeData="c:\temp\MessageBodyTracing.svclog" type="System.Diagnostics.XmlWriterTraceListener"
            name="traceListener">
            <filter type="" />
          </add>
        </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add type="System.Diagnostics.DefaultTraceListener" name="Default">
            <filter type="" /> …
Run Code Online (Sandbox Code Playgroud)

wcf logging trace

7
推荐指数
1
解决办法
7925
查看次数

SQLite:如何连接到内存中的共享缓存数据库?

我正在通过ADO.NET提供程序尝试SQLite 3.7.13的内存中共享缓存功能.以下连接字符串有效,但会生成非共享缓存db:

Data Source=:memory:
Run Code Online (Sandbox Code Playgroud)

当我尝试以下任何一个时:

Data Source=:memory:?cache=shared
Data Source=file::memory:?cache=shared
Data Source=file:x?mode=memory&cache=shared
Run Code Online (Sandbox Code Playgroud)

ArgumentException打开连接时我得到以下信息:

Invalid ConnectionString format for parameter "Data Source"
Run Code Online (Sandbox Code Playgroud)

对于SQLite内存中的共享缓存数据库,连接字符串应该是什么样的?

.net sqlite ado.net

6
推荐指数
1
解决办法
6413
查看次数

如何在运行时知道类型时将对象强制转换为类型?

我有这样的声明: MyClass myClass = report.DataSource as MyClass

在运行时期间,DataSource的类型是MyClass,但它与当前运行的项目位于不同的命名空间中.那是因为两个项目正在从同一个服务引用中创建相同的类.DataSource指向一个命名空间,MyClass强制转换来自不同的namesapce.(解释这是怎么发生的很复杂)

在运行时,如何使用从report.DataSource.GetType()返回的类型(从另一个命名空间返回MyClass)并将其用作类型转换而不是我不想要的命名空间中的"MyClass"?

(我希望我已经清楚地解释了.我的大脑现在有雾!)

.net c# wcf

5
推荐指数
1
解决办法
194
查看次数

为什么这两种日期格式不同?

我试图在WPF文本块中只生成日期编号,没有前导零并且没有额外的空格填充(这会抛弃布局).第一个产生带有空格的日期编号,第二个产生整个日期.根据文档,'d'应该产生一天(1-31).

string.Format("{0:d }", DateTime.Today);
string.Format("{0:d}", DateTime.Today);
Run Code Online (Sandbox Code Playgroud)

更新:添加%确实是诀窍.这里有适当的文档.

.net c# formatting datetime

2
推荐指数
1
解决办法
364
查看次数

在T-SQL中聚合GREATEST

我的SQL生锈了 - 我有一个简单的要求来计算两个列值中较大者的总和:

CREATE TABLE [dbo].[Test]
(
    column1 int NOT NULL, 
    column2 int NOT NULL
);

insert into Test (column1, column2) values (2,3)
insert into Test (column1, column2) values (6,3)
insert into Test (column1, column2) values (4,6)
insert into Test (column1, column2) values (9,1)
insert into Test (column1, column2) values (5,8)
Run Code Online (Sandbox Code Playgroud)

在SQL Server中没有GREATEST函数的情况下,我可以使用以下方法获取两列中较大的一列:

select column1, column2, (select max(c) 
                            from (select column1 as c
                                   union all
                                  select column2) as cs) Greatest
  from test
Run Code Online (Sandbox Code Playgroud)

而且我希望我可以这样简单地总结它们:

select sum((select max(c) 
              from (select column1 as …
Run Code Online (Sandbox Code Playgroud)

t-sql

2
推荐指数
1
解决办法
5824
查看次数